制作对象变量的可修改列表,并使列表与变量保持同步

本文关键字:变量 列表 同步 作对 修改 对象 | 更新日期: 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属性来获取更改后的数据。