相关疑难解决方法(0)

如何将WPF按钮绑定到ViewModelBase中的命令?

我有一个AttributeView包含各种属性的视图.还有一个按钮,按下时,它应该为属性设置默认值.我还有一个ViewModelBase类,它是我所有ViewModel的基类.问题是我似乎无法使用WPF将命令绑定到命令.

我试过这个,但它没有做任何事情:

<Button Command="{Binding DataInitialization}" Content="{x:Static localProperties:Resources.BtnReinitializeData}"></Button>
Run Code Online (Sandbox Code Playgroud)

该命令是在(如下ViewModelBase)中定义的:

public CommandBase DataInitialization { get; protected set; }
Run Code Online (Sandbox Code Playgroud)

在应用程序启动时,为该命令创建一个新实例:

DataInitialization = new DataInitializationCommand()
Run Code Online (Sandbox Code Playgroud)

但是,WPF绑定似乎没有"找到"命令(按下按钮什么都不做).当前视图中使用的ViewModel派生自ViewModelBase.我还能尝试什么(我对WPF很新,所以这可能是一个非常简单的问题)?

c# wpf command mvvm viewmodel

47
推荐指数
1
解决办法
18万
查看次数

Josh Smith对RelayCommand的实施有缺陷吗?

考虑参考Josh Smith的文章WPF Apps with Model-View-ViewModel Design Pattern,特别是a的示例实现RelayCommand(图3).(无需阅读整篇文章以了解此问题.)

在一般情况下,我想实现是优秀的,但我有一个代表团的问题CanExecuteChanged订阅到CommandManagerRequerySuggested事件.各州的文件RequerySuggested:

由于此事件是静态的,因此它只会作为弱引用保留在处理程序中.侦听此事件的对象应该对其事件处理程序保持强引用,以避免它被垃圾回收.这可以通过拥有私有字段并在附加到此事件之前或之后将处理程序指定为值来实现.

然而,示例实现RelayCommand不会对订阅的处理程序维护任何此类:

public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}
Run Code Online (Sandbox Code Playgroud)
  1. 这是否泄漏了弱RelayCommand客户端的漏洞,要求用户RelayCommand了解自己的实施CanExecuteChanged并维护一个实时参考?
  2. 如果是这样,例如,修改实现RelayCommand类似于以下内容以减轻CanExecuteChanged订户的潜在过早GC 是否有意义:

    // This event never actually fires.  It's purely lifetime mgm't.
    private event EventHandler canExecChangedRef;
    public event EventHandler CanExecuteChanged
    {
        add 
        { 
            CommandManager.RequerySuggested += value; …
    Run Code Online (Sandbox Code Playgroud)

wpf weak-references mvvm relaycommand icommand

41
推荐指数
4
解决办法
1万
查看次数

标签 统计

mvvm ×2

wpf ×2

c# ×1

command ×1

icommand ×1

relaycommand ×1

viewmodel ×1

weak-references ×1