制作对象变量的可修改列表,并使列表与变量保持同步
本文关键字:变量 列表 同步 作对 修改 对象 | 更新日期: 2023-09-27 18:24:34
我有一个带有不同变量的类。我想让用户修改这个变量。用户应该在例如DataGrid
中读取和写入值。我想将一些变量分离到不同的DataGrid
s。
class MyClass
{
int _number1; //show in DataGrid 1
int _number2; //show in DataGrid 1
string _name; //show in DataGrid 1
Adress _adress; //show in DataGrid 1
int _anotherNumber1; //show in DataGrid 2
int _anotherNumber2; //show in DataGrid 2
int _privateNumber //do not show the user
}
我的方法
为了对变量进行分组,我目前使用一个(修改后的)Dictionary
类。
//ObservableDictionary is a modified Dictionary class
private ObservableDictionary<string, object> _dataGrid1Properties;
public ObservableDictionary<string, object> DataGrid1Properties
{
get { return _dataGrid1Properties; }
}
//... other Grid lists
public MyClass()
{
_dataGrid1Properties = new ObservableDictionary<string, object>();
_dataGrid1Properties.Add("Number1", _number1);
//...
}
现在,当我的对象的值发生变化时,我可以更新列表:
int _number1;
public int Number1
{
get { return _number1; }
set { _number1 = value; _dataGrid1Properties["Number1"] = value; }
}
我的问题是修改列表时对象变量的更新。我没有提到我的对象。但我不能写ObservableDictionary<string, ref object>
之类的东西。。。
问题
当Dictionary
值更改时,如何更新对象的值?
正如Peter所说,这可以通过订阅CollectionChanged
事件来实现
public MyClass()
{
_dataGrid1Properties = new ObservableDictionary<string, object>();
_dataGrid1Properties.Add("Name", _name);
//...add other properties
//then wire up the CollectionChanged event
_dataGrid1Properties.CollectionChanged += _dataGrid1Properties_CollectionChanged;
}
void _dataGrid1Properties_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case System.Collections.Specialized.NotifyCollectionChangedAction.Replace:
{
if (e.NewItems != null)
{
if (e.NewItems.Count > 0 && e.NewItems[0] is KeyValuePair<string, object>)
{
KeyValuePair<string, object> item = (KeyValuePair<string, object>)e.NewItems[0];
System.Diagnostics.Debug.WriteLine(string.Format("key = {0}, new value = {1}", item.Key, item.Value));
}
}
break;
}
case System.Collections.Specialized.NotifyCollectionChangedAction.Add:
{
//new items added
//break;
}
//cases for Remove/Reset.
//break;
}
}
交付的.NET BCL版本没有ObservableDictionary
类,我在网上搜索并测试了这个类,它似乎可以工作,但是,如果你想在代码中采用它,请对它进行全面测试,因为它可能有错误。
事件的数据由NotifyCollectionChangedEventArgs
参数公开,您可以通过检查其Action
属性来检查导致此更改的原因(添加/删除/替换…),并通过检查NewItems/OldItems
属性来获取更改后的数据。