C# WPF-将方法建模为命令的执行事件(无RelayCommand或DelegateCommand)
我想为命令的C# WPF-将方法建模为命令的执行事件(无RelayCommand或DelegateCommand),c#,wpf,routed-commands,C#,Wpf,Routed Commands,我想为命令的已执行事件使用一个不在代码隐藏中的方法,为CanExecute使用另一个方法 我使用的是RoutedCommand,我不想使用委托命令或中继命令 我得到的是一个命令类: public class Commands { static Commands() { syncCommand = new RoutedUICommand("Sync", "syncCommand", typeof(Commands)); undoCommand = n
已执行
事件使用一个不在代码隐藏中的方法,为CanExecute
使用另一个方法
我使用的是RoutedCommand
,我不想使用委托命令或中继命令
我得到的是一个命令类:
public class Commands
{
static Commands()
{
syncCommand = new RoutedUICommand("Sync", "syncCommand", typeof(Commands));
undoCommand = new RoutedUICommand("Undo", "UndoCommand", typeof(Commands));
}
private static MyHandler handler;
public static MyHandler Handler
{
set { handler = value; }
get { return handler; }
}
private static RoutedUICommand syncCommand;
public static RoutedUICommand SyncCommand
{
get
{ return syncCommand; }
}
private static void SyncCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = Handler != null;
}
private static void SyncExecute(object sender, ExecutedRoutedEventArgs e)
{
Handler.Action();
}
private static RoutedUICommand undoCommand;
public static RoutedUICommand UndoCommand
{
get { return undoCommand; }
}
private static void UndoCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = Handler.WereChangesMade();
}
private static void UndoExecute(object sender, ExecutedRoutedEventArgs e)
{
Handler.Undo();
}
}
在ViewModel中,我得到了ICommand属性和按钮,以及绑定到这些属性的Command属性
我想使用上述方法作为传递给命令绑定的方法。当它们不在代码隐藏中时,我该怎么做呢?您需要向其中一个UI元素添加一个CommandBinding,因为RoutedUICommand需要在某个地方进行隧道和气泡处理。如果所有其他操作都失败,请打开主窗口
CommandBindings.Add(new CommandBinding(Commands.SyncCommand, Commands.SyncExecute, Commands.SyncCanExecute));
SyncExecute和SyncCanExecute需要可访问到此绑定的位置,因此private无法访问。您好,我编写了一个“排序”自定义命令绑定,您可以将RoutedCommand绑定到ICommand。()如何从Xaml实现它?这里我可能错了,但我认为x:Static关键字不支持方法。MSDN上的措辞是:“引用任何静态值代码实体”。来源()。我试过:。您正在将MVVM模式与WPF和bit进行争论。如果你喜欢使用XAML(而不是RelayCommand),你可以在你的视图中实现命令本身。。RoutedCommands更好地支持多个Commands的SourcesRelay命令允许您将逻辑放在ViewModel中,以便进行测试。诸如撤销之类的某些事情应该(并且是通过WPF)在UI中的每个能够撤销的控件上实现。但是,任何对数据本身进行实际操作的命令都应该在ViewModel上实现。因此,您可以使用常规RoutedCommands,调用ViewModel并在那里实现它,或者直接将命令绑定到ViewModel。RelayCommand可以支持多个源,您只需要正确的ViewModel范围(例如,MainWindowViewModel)