0

如果我有这样的课程:

public class MyClass:INotifyPropertyChanged
{
private Visibility isVisible;
private ObservableCollection<string> names;

public Visibility IsVisible
{
get{ return isVisible;}
set { isVisible = value; OnPropertyChanged("IsVisible");}
}

public ObservableCollection<string> Names
{
get { return names;}
set { names = value; OnPropertyChanged("Names");}
}

//ctor
public MyClass(){
     names = new ObservableCollection<string>();
}


//INotifyPropertyChanged implementation
 public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

}

在任何人斩首我之前 - 我已经做了相当多的查找并找到了各种各样的答案......

  1. 我是否修改publicprivate属性/变量以在我的绑定中使用?即我有一个问题,添加到names集合将触发OnPropertyChanged并且更改isVisible不会触发OnPropertyChanged。我的假设是,这是因为它不是names一个ObservableCollection地方,isVisible但我不确定......

  2. 如果我应该使用这些public属性 - 拥有私有属性有什么需要?

4

2 回答 2

4

您不需要私有财产,只有私有字段就足够了,因此请替换:

private Visibility isVisible {get; set;}

private Visibility isVisible;

如果我应该使用公共财产 - 拥有私人财产有什么需要?

您不能将自动属性与 INotifyPropertyChanged 一起使用。这就是为什么您需要为您的财产提供一个支持字段IsVisible

请参阅:实现 INotifyPropertyChanged 的​​优雅方式

于 2013-08-19T17:04:42.700 回答
1

所以我认为你混淆了属性和字段(又名变量)。

public class Example()
{

    public int FieldExample;

    private int _propertyExample;

    public int PropertyExample 
    {
        get
        {
            return _propertyExample;
        }
        set
        {
            _propertyExample = value;
        }
    }
}

在简单的使用场景中,字段和属性之间的区别并不明显。但是属性在引擎盖下有不同的管道,允许它们利用反射和绑定。对于 WPF,这意味着您必须拥有公共属性。公共属性的最佳实践是将其与私有(或受保护)字段相关联 - 该字段名称通常以 _ 为前缀和/或以小写字符开头。这称为“支持字段”。

私有支持字段保存实际数据,公共属性只是其他类可以与该数据交互的手段。在 get 和 set 块中,您可以放置​​任何您想要的代码:而不是返回我的支持字段,我可以放置:return 5;。它没有用,而且练习很差,但我可以。通常,位于 get 和 set 块中的代码仍应设置或获取值;尽管您可能会先验证输入,和/或先对其进行格式化。您在 WPF 集中实现的模式会引发属性已更改的事件。程序的其他部分正在侦听该事件,以便他们知道更新 UI。

因此,在您的代码中,如果您仅更改支持字段并且不引发发生更改的事件,则 UI 将不会更新。如果您正在对一个对象执行复杂的操作,并且希望推迟执行 UI 更新,直到完成一整批项目,您可能希望这种行为,但这是一种优化,对于初学者来说,您最好总是访问/设置到公共财产。

于 2013-08-19T18:12:08.733 回答