如果我有这样的课程:
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));
}
}
}
在任何一个人斩我之前 - 我已经做了很多查找并找到了一堆混合的答案......
我是否修改public
或private
属性/变量以用于绑定?即我有一个问题,即添加到names
集合会触发OnPropertyChanged
而更改isVisible
将不会触发OnPropertyChanged
。我的假设是,这是因为names
是ObservableCollection
,而isVisible
不是public
,但我不确定......
如果我应该使用{{1}}属性 - 拥有私有属性需要什么?
答案 0 :(得分:4)
您不需要私有财产,只有私有字段就足够了所以替换:
private Visibility isVisible {get; set;}
带
private Visibility isVisible;
如果我应该使用公共财产 - 需要什么 拥有私人的?
您不能将自动属性与INotifyPropertyChanged一起使用。这就是为什么你需要一个属性IsVisible
的支持字段。
答案 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更新,直到完成一批完整项目,您可能会希望这种行为,但这是一个优化,对于初学者而言,您最好总是访问/设置公共财产。