내 WPF 응용 프로그램에는 항목이있는 목록 상자가 있습니다. 목록 상자는 XAML의 xmldataprovider를 통해 채워진 다음 목록 상자의 Itemssource 속성에 바인딩됩니다.프로그래밍 방식으로 WPF의 목록 상자에 명령 추가
음은 XAML에서, 나는 수행하여 목록 상자에 COMAND 바인딩 :
<ListBox.CommandBindings>
<CommandBinding
Command="{x:Static local:mainApp.MyCmd}"
CanExecute="CanExecute"
Executed ="Executed" />
</ListBox.CommandBindings>
하지만 난 프로그래밍 방식으로 각 ListBoxItem의에 명령을 결합하는 방법을 모르겠어요. 그것을하는 방법?
미리 감사드립니다.
처음으로 의견을 보내지 않아서 죄송합니다. 이 모든 것을 주석에 넣을 수는 없습니다.
좋아요, 예 제가 사용자 지정 클래스에 등록하고 구현했지만 ICommandSource의 Executed 및 CanExecute 속성을 사용하고 있지 않습니다 (xaml에서도 주석이 달렸습니다). 나는 routedCommand에서 그들을 지정했지만 사용자 정의 클래스에서,이 수행하여 윈도우의 생성자에서 불가능했을 :
뒤에의 WinMain 코드 :
public WinMain()
{
InitializeComponent();
// Command binding. If I don't do this Executed and CanExecute are not executed
CommandBindings.Add(new CommandBinding(rcmd,
CommandBinding_Executed, CommandBinding_CanExecute));
}
후 나는의 WinMain 코드에서이 메소드를 구현을 뒤에 그것을 너무 같이
<Classes:CommandListBox x:Name="LayoutListBox"
Command="{x:Static local:WinMain.rcmd}"
... >
<...>
</Classes:CommandListBox>
:
// ExecutedRoutedEventHandler
private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
// Do stuff
}
// CanExecuteRoutedEventHandler
private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
// cBgWorkers is a class that check if a background worker is running
e.CanExecute = !cBgWorkers.isRunning;
//if (LayoutListBox != null) LayoutListBox.IsEnabled = !cBgWorkers.isRunning;
}
과의 WinMain XAML에서
는이 같은 명령을 호출그리고 내 사용자 정의 클래스 CommandListBox에 난 당신이 내가 사용 또는 배경 근로자가 완료 여부에 따라 제어 비활성화 볼 수있는 CanExecuteChanged 있습니다
이private void CanExecuteChanged(object sender, EventArgs e)
{
this.Enabled = !cBgWorkers.isRunning;
}
하지만 사용자 정의 클래스에서 내가 구현하지 않은를 당신이 말하는 이벤트 핸들러, OnSelected.
모든 작업이 정상적으로 수행되고 사용자 지정 컨트롤 호출 명령 및 CanExecute 메서드에 도달하고 CanExecute는 백그라운드 작업자가 완료되었는지에 따라 올바른 값을 true 또는 false로 가져오고 CanExecuteChanged는 사용자 지정 컨트롤에서 발생합니다. CanExecute는 값을 변경합니다. 백그라운드 작업자가 시작되면 사용 중지되지만 사용 완료되면 사용 불가능하게됩니다. 나는 디버깅을했고 배경 작업자가 끝나면 CanExecuteChanged가 실행되고 this.Enabled가 올바른 값을 얻고 있음을 알 수있다. 그러나 UI의 어떤 이유로 UI 컨트롤은 올바른 값을 얻었음에도 불구하고 컨트롤이 계속 실행되고 RunWOrkerCompleted (배경 worker) CommandManager.InvalidateRequerySuggested()로 UI를 강제 업데이트합니다.
I는 주석 처리를 행함으로써이 문제를 해결!
경우 (! LayoutListBox = NULL) LayoutListBox.IsEnabled = cBgWorkers.isRunning;
CanExecute 메서드입니다. 나는 무슨 일이 일어나는 지 이해하지 못한다. 나는 당신이 그것을 할 필요가 없습니다 무슨 말을 할 그런 경우
:
CommandBindings.Add(new CommandBinding(rcmd,
CommandBinding_Executed, CommandBinding_CanExecute));
및 CommandBinding_Executed & CommandBinding_CanExecute 구현. 내가 맞습니까?
그러나이 방법을 제거하면 어디에서 this.enabled =! cBgWorkers.isRunning을 설정할 수 있습니까?
WPF에서 내 사용자 지정 컨트롤의 isEnabled 속성을 자동으로 설정하고 싶습니다. 이 작업을 수행하는 방법?
미리 감사드립니다.
첨부 된 비헤이비어에 대한 기사를 적용하여 몇 가지 변경 사항을 적용하여 내 ListBox에 적용합니다. 그것은 잘 작동하지 않거나 아마도 내가 잘못된 것을하고 있습니다. 내가 원하는 것은 긴 작업 (백그라운드 작업자)이 실행될 때 ListBox 멤버 (listBoxItems)를 선택할 수 없도록하는 것입니다. 그래서 내가 수정 한 문서의 방법 중 하나입니다
는static void OnListBoxItemSelected(object sender, RoutedEventArgs e)
{
// Only react to the Selected event raised by the ListBoxItem
// whose IsSelected property was modified. Ignore all ancestors
// who are merely reporting that a descendant's Selected fired.
if (!Object.ReferenceEquals(sender, e.OriginalSource))
return;
ListBoxItem item = e.OriginalSource as ListBoxItem;
if (item != null)
{
// (*) See comment under
item.IsEnabled = !cBgWorkers.isRunning;
if (!cBgWorkers.isRunning)
{
item.BringIntoView();
}
}
}
(*) cBgWorkers는 몇 가지 방법과 속성을 가진 공공 정적 클래스입니다. 현재 백그라운드 작업자가 없음을 나타내는 isRunning 속성 중 하나입니다. 다음 백그라운드 작업자가 실행되고 있지 않으면 목록 상자 멤버를 사용하도록 설정해야합니다. 그렇지 않으면 사용자가 하나의 목록 상자 항목을 클릭 할 때 비활성화해야하기 때문에 현재 페이지가 다른 페이지로 변경되지 않습니다. 내 주요 응용 프로그램에서 페이지).
백그라운드 작업자 (bw) 또는 모두가 실행 중이고 listbox 항목을 모두 선택하면 ok입니다. bw가 실행되고 현재 페이지를 다른 페이지로 변경하지 않기 때문에 목록 상자 항목이 비활성화됩니다. 물론, 목록 상자 항목 (또는 목록 상자 항목)을 사용하지 않도록 설정 한 경우 비활성화 되었기 때문에 다시 선택할 수 없습니다. 문제는 BW가 실행되는 동안 비활성화 된 목록 상자 항목을 bw로 끝내기를 원하기 때문입니다. 그들은 다시 활성화됩니다. 불행히도 첨부 된 동작은 WPF에 의해 자동으로 수행되지 않고 명령에 WPF에 의해 자동으로 업데이트되는 이점이 있습니다. 그래서, bw가 실행 중이거나 각각 실행되지 않을 때 listbox 항목을 비활성화/다시 활성화하는 방법은 무엇입니까?
내가 알고있는 한, 붙어있는 행동의 한 가지 이점은 행동을 끊임없이 호출하지 않기 때문에 (행동 선택 (예 : 선택)이 생성 될 때만) 더 효율적이라고 생각한다는 것입니다. 컨트롤은 컨트롤에 바인드 된 액션이 실행될 수 있는지 끊임없이 체크합니다 (실행되지 않으면 WPF는 컨트롤을 자동으로 활성화하고 그렇지 않으면 비활성화 된 것처럼 보입니다).
감사합니다.
이 질문에 도움이 될 수 있습니다 : http://stackoverflow.com/questions/845446/wpf-mvvm-commands-are-easy-how-to-connect-view-and-viewmodel-with-routedevent –