我正在尝试学习命令,并设置了一个简单的wpf项目来使用自定义命令。我在窗口上有一个ListBox和一个Button。当ListBox具有焦点并且选择了Item时,我希望启用Button,否则应该禁用它。
我在一个单独的CustomCommands类中定义了一个CustomCommand:
Public Shared ReceivedFocus As New RoutedCommand
在我的窗口中,我将其设置如下:
<CommandBinding
Command="{x:Static local:CustomCommands.ReceivedFocus}"
CanExecute="CanActivate"
Executed="ChangeSelection">
</CommandBinding>
并使用ListBox的命令,如下所示:
<ListBox
x:Name="lstInactive">
<i:Interaction.Triggers>
<i:EventTrigger
EventName="GotFocus">
<i:InvokeCommandAction
Command="{x:Static local:CustomCommands.ReceivedFocus}"
</i:InvokeCommandAction>
</i:EventTrigger>
</i:Interaction.Triggers>
</ListBox>
最后,CanActivate例程是:
Private Sub CanActivate(sender As Object, e As CanExecuteRoutedEventArgs)
If lstInactive.SelectedIndex >= 0 Then
e.CanExecute = True
Else
e.CanExecute = False
End If
End Sub
这不起作用。主要问题是我不明白如何将CanExecute值与Button相关联。我应该忽略CanActivate例程中的CanExecute值,而只是设置Button的Enabled属性吗?如果是这样,CanExecuteRoutedEventArgs的CanExecute参数的值是多少?
第二个问题是,在我第二次选择ListBox中的项目之前,GotFocus事件才会触发。
或许我根本没有掌握指挥,这不是正确的方法。这个小项目本身并不重要,它旨在确保在我开始在“真实”项目中使用命令之前阅读了大量关于它的文章后理解命令。可悲的是,在这个阶段很明显我没有。
答案 0 :(得分:0)
这不起作用。主要问题是我不明白如何将CanExecute值与Button相关联。
将其Command
属性绑定到同一命令:
<Button Content="Button" Command="{x:Static local:CustomCommands.ReceivedFocus}" />
然后应根据您在Button
事件处理程序中设置CanExecute
属性的值启用或禁用CanActivate
。
您可能还想收听SelectionChanged
事件。这按预期工作:
<StackPanel>
<StackPanel.CommandBindings>
<CommandBinding
Command="{x:Static local:CustomCommands.ReceivedFocus}"
CanExecute="CanActivate"
Executed="ChangeSelection">
</CommandBinding>
</StackPanel.CommandBindings>
<ListBox x:Name="lstInactive">
<ListBoxItem>first</ListBoxItem>
<ListBoxItem>second</ListBoxItem>
<ListBoxItem>third</ListBoxItem>
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{x:Static local:CustomCommands.ReceivedFocus}">
</i:InvokeCommandAction>
</i:EventTrigger>
</i:Interaction.Triggers>
</ListBox>
<Button Content="Button" Command="{x:Static local:CustomCommands.ReceivedFocus}" />
</StackPanel>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void CanActivate(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = lstInactive.SelectedIndex >= 0;
}
private void ChangeSelection(object sender, ExecutedRoutedEventArgs e)
{
}
}