为什么`<button command =“{x:Static ...} ..”>`工作但是`</button> <button command =“{Binding ...} ..”>``没有?</按钮>

时间:2014-01-29 22:02:26

标签: c# wpf mvvm command

我是WPF新手,我正在尝试实现自定义Command, 我做的是我实现了ICommand接口,我使用两种方式将该实现绑定到一个按钮,其中一个是静态扩展Marckup 和一个正常的绑定, 它适用于{x:Static},但在使用{Binding}

时失败并显示此错误
  

System.Windows.Data错误:39:BindingExpression路径错误:   'object'''ViewModel'上找不到'StartCommand'属性   (的HashCode = 30880833)”。 BindingExpression:路径=启动命令;   DataItem ='ViewModel'(HashCode = 30880833);目标元素是'Button'   (名称= '');目标

这是我的代码

XAML

<Window x:Class="Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="75" Width="300">
    <StackPanel Orientation="Horizontal" Height="30">
        <Button Command="{Binding StartCommand}" Content="Start" Margin="5,0"/>        
        <TextBlock Text="{Binding Name}"/>
    </StackPanel>
</Window>

代码

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        DataContext = new ViewModel { Name = "Simple property" };
    }
}

class ViewModel
{
    public string Name { get; set; }
    // static to use with {x:Static}
    public ICommand StartCommand = new StartCommand();
}

class StartCommand : ICommand
{
    public bool CanExecute(object parameter)
    {
        return false;
    }

    public event System.EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public void Execute(object parameter)
    {
        MessageBox.Show("Start Executed");
    }
}

我的代码出了什么问题?我弄乱了什么吗? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

因为

  

您可以x:Static对静态字段或属性进行引用

虽然字段不是有效的binding source,但您需要将其转换为属性:

public ICommand StartCommand { get; set; }

并在例如costructructor中初始化它

public ViewModel()
{
   StartCommand = new StartCommand();
}