Один из способов сделать это - Child
опубликовать событие OnStringPropertyChanged
, которое передает предыдущее значение StringProperty
. Затем создайте производную SortedList
, которая переопределяет метод Add
, чтобы подключить обработчик к этому событию. Всякий раз, когда происходит событие, удалите элемент из списка и повторно добавьте его с новым значением StringProperty. Если вы не можете изменить Child
, я бы создал прокси-класс, который либо наследует, либо переносит Child
для реализации события.
Если вы не хотите этого делать, я все равно использовал бы SortedList
, но внутренне управлял бы логикой сортировки, описанной выше, каждый раз, когда StringProperty
необходимо изменить. Чтобы быть СУХИМЫМ, предпочтительно направлять все обновления на StringProperty
с помощью общего метода, который правильно управляет сортировкой, вместо того, чтобы обращаться к списку напрямую из различных мест в классе и дублировать логику управления сортировкой.
Я бы также предостерег от того, чтобы разрешить контроллеру передавать ссылку на Child
, что позволяет ему манипулировать StringProperty
после его добавления в список.
public class Parent{
private SortedList<string, Child> _children = new SortedList<string, Child>();
public ReadOnlyCollection<Child> Children{
get { return new ReadOnlyCollection<Child>(_children.Values); }
}
public void AddChild(string stringProperty, int data, Salamandar sal){
_children.Add(stringProperty, new Child(stringProperty, data, sal));
}
public void RemoveChild(string stringProperty){
_children.Remove(stringProperty);
}
private void UpdateChildStringProperty(Child c, string newStringProperty) {
if (c == null) throw new ArgumentNullException("c");
RemoveChild(c);
c.StringProperty = newStringProperty;
AddChild(c);
}
public void CheckSalamandar(string s) {
if (_children.ContainsKey(s))
var c = _children[s];
if (c.Salamandar.IsActive) {
// update StringProperty through our method
UpdateChildStringProperty(c, c.StringProperty.Reverse());
// update other properties directly
c.Number++;
}
}
}