0

因为这是这么长和脱垂,真的没有问一个连贯的问题:

1:在视图模型中实现主要对象的子属性的正确方法是什么?

2:有没有人找到解决delegatecommand.RaiseCanExecuteChanged 问题的方法?还是我需要自己修复它,直到 MS 修复?

对于故事的其余部分......继续。

在我的视图模型中,我有一个与我的 Model.Doctor 相关联的医生对象属性,它是一个 EF POCO 对象。我在 setter 中有 onPropertyChanged("Doctor") :

       Private Property Doctor() As Model.Doctor
            Get
                Return _objDoctor
            End Get
            Set(ByVal Value As Model.Doctor)
                _objDoctor = Value
                OnPropertyChanged("Doctor")
            End Set
        End Property

如果整个对象发生更改,则唯一一次触发 OnPropertyChanged。除了我需要知道医生的属性何时更改之外,这不会是一个问题,以便我可以在我的表单上启用其他控件(例如保存按钮)。我试图以这种方式实现它:

Public Property FirstName() As String
        Get
            Return _objDoctor.FirstName
        End Get
        Set(ByVal Value As String)
            _objDoctor.FirstName = Value
            OnPropertyChanged("Doctor")
        End Set
    End Property

这是从 Karl Shifflet 的 XAMLPowerToys 控件中获取的,所以我必须假设它是正确的。但是对于我的生活,我无法让它发挥作用。

我在这里包含了 PRISM,因为我使用一个统一容器来实例化我的视图,它是一个单例。我通过 eventtaggregator 收到视图模型的更改通知,然后用新值填充 Doctor。我做这一切的原因是因为 PRISM 的 DelegateCommand。所以也许这是我真正的问题。

似乎 DelegateCommand 中有一个错误,它不会在实现它的命令上触发 RaiseCanExecuteChanged 方法,因此需要手动触发。我的 onPropertyChangedEventHandler 中有相应的代码。当然,这也不是通过 ICommand 接口实现的,所以我必须打破并制作我的属性 DelegateCommand(of X) 以便我可以访问每个命令的 RaiseCanExecuteChanged。

4

2 回答 2

1

2:有没有人找到解决delegatecommand.RaiseCanExecuteChanged 问题的方法?还是我需要自己修复它,直到 MS 修复?

使用 Josh Smith 的RelayCommand而不是 DelegateCommand。它解决了 CanExecute 命令未引发的问题,并且不会像 DelegateCommand 那样泄漏内存:

“它将事件订阅委托给 CommandManager.RequerySuggested 事件。这可确保 WPF 命令基础结构在询问内置命令时询问所有 RelayCommand 对象是否可以执行。”

于 2010-04-29T10:23:12.243 回答
0

关于 2:Microsoft 没有要修复的错误,因为根据设计,您必须明确告诉命令重新评估自身。当然,您可能不同意他们的决定。

如果您希望在触发 RaiseCanExecuteChanged 时重新评估 DelegateCommands,请参阅http://compositewpf.codeplex.com/Thread/View.aspx?ThreadId=47338

于 2010-04-29T10:32:18.643 回答