WPF按钮命令没有触发,我缺少什么?

时间:2015-08-17 21:05:38

标签: c# wpf xaml

我觉得发布这个很糟糕,因为我看到了很多类似的帖子,但经过这些帖子之后,我还无法完全诊断出我的问题。我所拥有的是一个使用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,但是当我点击按钮时,代码无法到达。我有一个非常类似的实现(或者我认为)之前的工作,所以这真的让我很困惑。如何在点击时触发命令?

4 个答案:

答案 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中遇到断点,但事实证明当你单击按钮时它没有点击它。