我觉得发布这个很糟糕,因为我看到了很多类似的帖子,但经过这些帖子之后,我还无法完全诊断出我的问题。我所拥有的是一个使用MVVM模式设计并使用RelayCommand()实现命令的WPF应用程序。
在我的用户控件的XAML中,我在这里设置了数据上下文:
<UserControl.DataContext>
<viewModel:SidePanelViewModel />
</UserControl.DataContext>
然后在XAML中进一步向下我有这个片段,我指定了一个按钮的命令
<TextBlock FontWeight="Bold" Margin="0,0,0,10">Service List</TextBlock>
<ListBox MaxHeight="100"
ItemsSource="{Binding ServiceList}"
SelectedItem="{Binding ServiceToRemove}">
</ListBox>
<Button HorizontalAlignment="Left" Width="60" Margin="0,10"
Command="{Binding RemoveServiceCommand}">Remove</Button>
我将按钮绑定到我在RemoveApplicationCommand
这里定义的Command SidePanelViewModel
:
public ICommand RemoveServiceCommand
{
get { return new RelayCommand(RemoveService, CanRemoveService); }
}
private void RemoveService()
{
ServerList.Remove(ServiceToRemove);
}
private bool CanRemoveService()
{
return true;
}
问题
如果我调试,按钮启动时会到达RemoveServiceCommand
的getter,但是当我点击按钮时,代码无法到达。我有一个非常类似的实现(或者我认为)之前的工作,所以这真的让我很困惑。如何在点击时触发命令?
答案 0 :(得分:1)
Command="{Binding RemoveApplicationCommand}"
您的意思是RemoveServiceCommand
吗?
答案 1 :(得分:0)
您将在获取中返回新的RelayCommand,但不保存/缓存该实例。将其保存在成员变量中。
if (_cmd == null)
_cmd = new ....
return _cmd;
答案 2 :(得分:0)
尝试像这样实施
private ICommand finishCommand;
public ICommand FinishCommand
{
get
{
if (this.finishCommand == null)
{
this.finishCommand = new RelayCommand<object>(this.ExecuteFinishCommand, this.CanExecutFinishCommand);
}
return this.finishCommand;
}
}
private void ExecuteFinishCommand(object obj)
{
}
private bool CanExecutFinishCommand(object obj)
{
return true;
}
答案 3 :(得分:0)
事实证明调试器整个时间都在使用RemoveService,但我没有在那里放置断点。我的RemoveService实现ServerList.Remove()
中的名称应该是ServiceList.Remove()
。我假设调试器会在RemoveServiceCommand属性的getter中遇到断点,但事实证明当你单击按钮时它没有点击它。