C# WPF绑定,始终创建新对象
在我的模型中,我有以下属性C# WPF绑定,始终创建新对象,c#,wpf,binding,C#,Wpf,Binding,在我的模型中,我有以下属性 public List<IColumnElement> MenuItems { get { return new List<IColumnElement>() { new Table(), new FieldSet() }; } } 公共列表菜单项 { 得到 { 返回新列表(){new Table(),new FieldSet()}; } } 它作为Itemssource绑定到上下文菜单,并创建两个元素“Table”和“
public List<IColumnElement> MenuItems
{
get
{
return new List<IColumnElement>() { new Table(), new FieldSet() };
}
}
公共列表菜单项
{
得到
{
返回新列表(){new Table(),new FieldSet()};
}
}
它作为Itemssource
绑定到上下文菜单,并创建两个元素“Table”和“FieldSet”。如果单击元素,则绑定对象应添加到集合中。但是,绑定列表只生成一次,并且始终返回相同的两个对象
是否有一个好的解决方案可以使绑定始终为
表和字段集返回新对象?WPF绑定通常会响应更改。当您第一次启动时,该属性最初是绑定的(在您看到它的时候),但是直到您的代码告诉WPF该属性已经更改,它才会再次检查
告诉WPF属性已更改的方法是通过实现。包含MenuItems
的类将实现该接口,然后当您希望WPF再次调用getter时,您将调用PropertyChanged
事件,并将属性名称作为参数传入
为了方便起见,通常需要实现提供接口的基类和
internal void RaisePropertyChanged(String propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
然后调用RaisePropertyChanged(“MenuItems”)代码>以触发绑定更新
作为一个旁注,我会考虑调整你的设计以拥有上下文菜单列表选项,并且当你从上下文菜单中选择相应的选项时,让你的代码隐藏/视图模型负责构建必要的对象。p> WPF绑定通常是响应变化而发生的。当您第一次启动时,该属性最初是绑定的(在您看到它的时候),但是直到您的代码告诉WPF该属性已经更改,它才会再次检查
告诉WPF属性已更改的方法是通过实现。包含MenuItems
的类将实现该接口,然后当您希望WPF再次调用getter时,您将调用PropertyChanged
事件,并将属性名称作为参数传入
为了方便起见,通常需要实现提供接口的基类和
internal void RaisePropertyChanged(String propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
然后调用RaisePropertyChanged(“MenuItems”)代码>以触发绑定更新
作为一个旁注,我会考虑调整你的设计以拥有上下文菜单列表选项,并且当你从上下文菜单中选择相应的选项时,让你的代码隐藏/视图模型负责构建必要的对象。p> 该代码在调用getter时创建一个新列表,这并不理想。改为创建私有属性,并在getter中检查
if(_list==null)_list=newlist(){new Table(),new FieldSet()}
,然后您可以返回_列表
,这样只会创建它once@Rachel不,相反。每次单击关联菜单项时,我都需要一个新对象,但似乎绑定只会在第一次绑定时创建列表
,因此总是返回相同的对象。哦,好的,我明白了。。。在这种情况下,您可能希望使用ICommand
在单击时触发,从而重新创建列表。只要调用getter,该代码就会创建一个新列表,这并不理想。改为创建私有属性,并在getter中检查if(_list==null)_list=newlist(){new Table(),new FieldSet()}
,然后您可以返回_列表
,这样只会创建它once@Rachel不,相反。每次单击关联菜单项时,我都需要一个新对象,但似乎绑定只会在第一次绑定时创建列表
,因此总是返回相同的对象。哦,好的,我明白了。。。在这种情况下,您可能希望使用ICommand
在单击时触发,从而重新创建列表。太好了,每次调用RaisePropertyChanged(nameof(MenuItems))
都会生成/绑定一个新对象。哦,我多么期待有一天能使用nameof
。。。硬编码字符串杀死了我,但我被困在.NET4=(很好,调用RaisePropertyChanged(nameof(MenuItems))
每次都会生成/绑定一个新对象。噢,我多么期待有一天能使用nameof
啊……硬编码字符串杀死了我,但我被困在.NET4上=(