何时使用公共或私人财产?

时间:2013-08-19 17:01:05

标签: c# wpf

如果我有这样的课程:

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。我的假设是,这是因为namesObservableCollection,而isVisible不是public,但我不确定......

  2. 如果我应该使用{{1}}属性 - 拥有私有属性需要什么?

2 个答案:

答案 0 :(得分:4)

您不需要私有财产,只有私有字段就足够了所以替换:

private Visibility isVisible {get; set;}

private Visibility isVisible;
  

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

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

请参阅:An elegant way to implement INotifyPropertyChanged

答案 1 :(得分: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更新,直到完成一批完整项目,您可能会希望这种行为,但这是一个优化,对于初学者而言,您最好总是访问/设置公共财产。