これを行う唯一の現実的な方法は、変更を監視できるコレクションを使用し、変更時に発生したイベントを処理して、プロパティを更新することです。
のようなものObservableCollection<T>
が法案に適合します。
例:
public class MyObject
{
public string Fruits{get;set;}
public IList<string> FruitList
{
get
{
var list = new ObservableCollection<string>(Fruits.Split(','));
list.CollectionChanged += (s,ea) => {
var items = (IList<string>)s;
Fruits = String.Join(",",items);
};
return list;
}
}
}
使用法:
var obj= new MyObject(){ Fruits="Apple,Banana,Orange" };
var list = obj.FruitList;
list.Add("Satsuma");
list.Add("Grapes");
list.Remove("Apple");
Console.WriteLine(obj.Fruits); // Output: Banana,Orange,Satsuma,Grapes
実例: http: //rextester.com/KCT33825
ここでの概念が機能するのを見て、上記の実装は少し危険を伴うことに注意する価値があります。アクセサObservableCollection
を呼び出すたびに新しいものが作成され、意図しない結果が生じる可能性があります。get
たとえば、元の行の直前に次の行を追加すると、次のようになりますConsole.WriteLine
。
Console.WriteLine("{0}", obj.FruitList == list);
それはあなたが期待するかもしれない(そしてfalse
概念的にはそうすべきである)ように奇妙に見えるかもしれない出力を出し、同じリストを指し示します。list
obj.FruitList
これを回避するには、実装を変更して1つだけを作成しObservableCollection
、常にget
アクセサーからそれを返します。
public class MyObject
{
private string fruits;
private ObservableCollection<string> fruitList;
public string Fruits
{
get{ return this.fruits; }
set
{
this.fruits = value;
this.fruitList = CreateFruitList();
}
}
private ObservableCollection<string> CreateFruitList()
{
var list = new ObservableCollection<string>(this.fruits.Split(','));
list.CollectionChanged += (s,ea) => {
var items = (IList<string>)s;
this.fruits = String.Join(",",items);
};
return list;
}
public IList<string> FruitList
{
get
{
return fruitList;
}
}
}
今、すべてが再び世界で正しいです!