1

几个(新手)问题:

1)我看到很多

public Person SelectedPerson { get; set; } 

我假设这不会触发属性更改?

所以,如果我想这样做,我必须提供以下内容?

    private Person selectedPerson;
    public Person SelectedPerson
    {
        get
        {
            return this.selectedPerson;
        }
        set
        {
            if ((this.selectedPerson != value))
            {
                this.selectedPerson = value;
                base.OnPropertyChanged("SelectedPerson");
                // Note: Using ViewModelBase

            }
        }
    }

2)如果我有以下情况:

    public bool CanDeletePerson
    {
        get
        {
            return SelectedPerson != null;
        }
    }

以及在 XAML 中

< Button IsEnabled="{Binding CanDeletePerson}" 
Command="{Binding DeletePersonCommand}"> Delete </ Button >

如何让它重新评估 CanDeletePerson 属性? 基本上,它最初是禁用的,但是当我单击网格并逐行移动时,SelectedPerson 正在更新,但 CanDeletePerson 没有获得更新的值,那么我如何让它再次实际检查该值?

3) 我明白了

...取决于是否有任何东西订阅了该事件

您如何订阅活动?

4

4 回答 4

3
  1. 正确-不会触发
  2. 是的,要CanDeletePerson重新评估,您可以提高 PropertyChanged on CanDeletePerson,就像这样

        set
        { 
            if ((this.selectedPerson != value))
            { 
                this.selectedPerson = value; 
                base.OnPropertyChanged("SelectedPerson"); 
                base.OnPropertyChanged("CanDeletePerson");
            }
        }
    
  3. 与任何正常事件一样,但如果您使用的是 WPF,则通常不需要显式订阅

于 2009-08-11T02:57:17.277 回答
2

是的,自动属性不会触发该PropertyChanged事件。

您可以通过添加到setterCanDeletePerson来重新评估。OnPropertyChanged("CanDeletePerson")SelectedPerson

我不确定您的最后一点是否是一个问题,但您可以像订阅任何其他事件一样订阅 PropertyChanged 事件。MyClass.PropertyChanged += MyClassPropertyChanged

MyClassPropertyChanged 在哪里

private void MyClassPropertyChanged(object sender, PropertyChangedEventArgs args)
{
    args.PropertyName .... //<-- Name of property changed.
}

但你不应该这样做。WPF 会订阅它需要的事件。

于 2009-08-11T02:55:12.163 回答
1

这是一篇介绍 MVVM 模式的好文章的链接。

具体来说,如果您查看 RelayCommand 类,它在实现 ICommand 对象并允许您指定谓词来评估是否可以执行 Command 方面做得很好。

RelayCommand 中的 canExecute 谓词的计算使您无需将单独的属性绑定到 Button 的 IsEnabled 属性。

我通常遵循实现私有属性一文中的示例,该属性为 canExecute 谓词提供布尔值。

那篇文章对我开始使用该模式很有帮助。

于 2009-08-11T03:36:34.507 回答
0

如果您使用 PropertyChanged 事件,您的类需要实现 INotifyProperyChanged 接口并在必要时引发该事件。在 WPF 中,数据绑定的默认值是 DependencyProperty,因此如果您使用 PropertyChanged 事件,则必须在 XAML 中做一些事情(假设您的班级人员有一个 Name 属性,您可以在其中引发 PropertyChanged 事件):

<TextBlock Text={Binding Path=Name, UpdateSourceTrigger=PropertyChanged} />
于 2009-08-11T10:43:41.220 回答