首先,您需要对WPF和MVVM有一些基本的了解。
您有一个类,将要绑定到UI上。该类不是.xaml.cs文件。
它完全独立于视图。您需要将该类的实例放入窗口的DataContext中,可以通过在.xaml.cs中调用类似于以下内容的代码来实现:
this.DataContext = new MyViewModel()
现在,你的 MyViewModel 类需要一个类型为 ICommand 的属性。最佳实践是创建一个实现了 ICommand 接口的类。通常称之为 DelegateCommand 或 RelayCommand。例如:
public class DelegateCommand : ICommand
{
private readonly Predicate<object> _canExecute;
private readonly Action<object> _execute;
public event EventHandler CanExecuteChanged;
public DelegateCommand(Action<object> execute)
: this(execute, null)
{
}
public DelegateCommand(Action<object> execute,
Predicate<object> canExecute)
{
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
if (_canExecute == null)
{
return true;
}
return _canExecute(parameter);
}
public void Execute(object parameter)
{
_execute(parameter);
}
public void RaiseCanExecuteChanged()
{
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, EventArgs.Empty);
}
}
}
然后在你的ViewModel中创建一个带有该类实例的属性。像这样:
public class MyViewModel{
public DelegateCommand AddFolderCommand { get; set; }
public MyViewModel(ExplorerViewModel explorer)
{
AddFolderCommand = new DelegateCommand(ExecuteAddFolderCommand, (x) => true);
}
public void ExecuteAddFolderCommand(object param)
{
MessageBox.Show("this will be executed on button click later");
}
}
在您的视图中,现在可以将按钮的命令绑定到该属性。
<Button Content="MyTestButton" Command="{Binding AddFolderCommand}" />
一个路由命令是指框架中默认存在的东西(如复制、粘贴等)。如果你是MVVM的初学者,在掌握“普通”命令的基本理解之前,不应该考虑创建路由命令。
回答你的第一个问题:将命令设置为静态和/或常量绝对不是必要的。(请参见MyViewModel类)
你的第二个问题:你可以使用默认值初始化列表,将其放入{ }括号中。例如:
var Foo = new List<string>(){ "Asdf", "Asdf2"};
您没有一个您初始化属性的对象。您有一个列表,您在其中进行初始化,然后使用您放入{
括号中的参数调用Add()
。
这也是您的情况基本发生的事情。您有一个集合,您使用一些值进行初始化。
ICommand
接口,就没问题了。 - DominikPredicate<T>
基本上与Func<T,bool>
相同。 - Dominik