我想创建一个可绑定的Command。我需要的是类似的东西(我不能使用),而假设Command是我的ICommand实现:
public static readonly DependencyProperty CommandProperty = DependencyProperty.Register(
"Command", typeof(Command), typeof(MainWindow), new PropertyMetadata(new Command(OnCommand)));
public static void OnCommand(object param)
{
}
我想到的选项是:
1)像上面的代码一样使用它。 问题:我需要在命令回调中使用当前实例,我需要通过命令编辑此实例。由于此控件不是单例,我不能只使用静态实例变量。通过作为命令参数来管道实例似乎也不是一个理智的想法。我无法在构造函数中创建DependencyProperty,因为它只是readonly。
2)将DependencyProperty创建为非readonly,在构造函数中将其设置为使用非静态方法。
问题:我不能这样做,因为我得到一个例外,即“Command”在尝试初始化控件时必须是DependencyProperty,即使我在InitializeComponents之前初始化它。
3)使用属性而不是带参数的命令。
问题:说我想要使用的命令参数是字符串。我是否想要使用文本框内容,该命令会将文本发送到控件并触发某些内容。我不希望触发器在文本上被更改,并且使用另一个布尔属性作为“立即执行标记”将非常难看
我也有其他一些尝试,但在尝试打字时,我有点忘了他们。虽然我知道MVVM在技术上不应该以这种方式工作,但是我需要关闭Control并且ViewModel知道要提交给控件的内容,并不知道如何以及如何处理它。
有没有办法在第3点没有使用'hack'(imho)的情况下实现我的目标?
修改 我在这里有选项4,技术上有效。我使用普通的Command Dependency Property并在正常的Command Property中保留一个空的Setter。我的DependencyPropertyChanged回调检查Dependency属性的更改是否为内部,如果不是,则回滚更改。尝试了它,它的工作原理。
规范:至于我需要它:我的控件需要提供一个命令,你用一个参数调用命令来执行控件内部操作。我不能使用任何文本框,正如我在其他选项中指定的那样,我可以尝试的其他内容对我来说并不合适。