gpt4 book ai didi

c# - 实现自定义 WPF 命令

转载 作者:行者123 更新时间:2023-12-05 00:49:29 24 4
gpt4 key购买 nike

我想实现一个自定义的WPF命令,我搜索发现如下代码:

public static class CustomCommands
{
public static readonly RoutedUICommand Exit = new RoutedUICommand
(
"Exit",
"Exit",
typeof(CustomCommands),
new InputGestureCollection()
{
new KeyGesture(Key.F4, ModifierKeys.Alt)
}
);

//Define more commands here, just like the one above
}


有两件事我想不通。

  1. 需要static readonly命令吗?我们不能只使用 const 声明它吗?

  2. new InputGestureCollection() { new KeyGesture(Key.F4, ModifierKeys.Alt) } 究竟是什么?如果它正在调用默认构造函数并初始化属性,那么应该有一个要分配的属性,但没有什么要分配的。 InputGestureCollection 有大括号,但在大括号内它没有初始化任何属性。如何?这种说法是什么?

最佳答案

首先,您需要对带有 MVVM 的 WPF 有一些基本的了解。您有一个要绑定(bind)到 UI 的类。该类不是 .xaml.cs

它完全独立于 View 。您需要将该类的一个实例放入 Window 的 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");
}
}

在您看来,您现在可以将按钮的命令绑定(bind)到该属性。

<Button Content="MyTestButton" Command="{Binding AddFolderCommand}" />

路由命令是默认情况下已经存在于框架中的东西(复制、粘贴等)。如果您是 MVVM 的初学者,那么在您基本了解“普通”命令之前,您不应该考虑创建路由命令。

回答您的第一个问题:绝对没有必要将命令设为静态和/或常量。 (参见 MyViewModel 类)

您的第二个问题:您可以使用放入 {-括号的默认值初始化列表。示例:

var Foo = new List<string>(){ "Asdf", "Asdf2"};

您没有初始化属性的对象。您有一个初始化列表,然后使用您放在 {-brackets 中的参数调用 Add()

这也是在您的情况下发生的基本情况。你有一个用一些值初始化的集合。

关于c# - 实现自定义 WPF 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39788539/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com