в моем проекте Silverlight 4 у меня есть простой класс, реализующий интерфейс, такой как:
public interface IMyClass
{
string Name { get; set; }
anyotherclass Value { get; set; }
}
родительский класс содержит коллекцию элементов IMyClass, например:
public class ParentClass
{
ObservableCollection<IMyClass> Children { get; }
}
Теперь я хочу убедиться, что IMyClass.Name является уникальным в коллекции Children. Пользователь может изменить IMyClass.Name - поэтому мне нужно проверить, есть ли имя в коллекции. Я хочу использовать механизм исключения и проверки Silverlight, мое XAML-текстовое поле выглядит так:
<TextBox Text="{Binding
ValidatesOnExceptions=true,
NotifyOnValidationError=true,
Mode=TwoWay,
Path=Name}"/>
Так что мне нужно проверить в установщике свойства Name, например:
public string Name
{
get { return _name; }
set
{
if (value == _name)
return;
if (CollectionAlreadyContainsName(this, value))
throw new ArgumentException("The name already exists");
else
_name = value;
OnPropertyChanged("Name");
}
}
И здесь возникает проблема: CollectionAlreadyContainsName необходимо знать коллекцию, но в IMyClass-объекте я не знаю, в какой коллекции я нахожусь. Мне нужно сохранить ссылку на родителя, как
public interface IMyClass
{
string Name { get; set; }
anyotherclass Value { get; set; }
ParentClass Parent { get; }
}
что на мой взгляд плохо из-за перекрестных ссылок и необходимости убедиться, что родитель всегда установлен правильно. Поэтому я ищу другой способ сделать это. Одна идея состояла в том, чтобы позволить ParentClass прослушивать событие NameChanged IMyClass и отменить изменение имени в случае необходимости. Но это не будет работать с упомянутым механизмом исключения и проверки Silverlight.
Есть идеи, как решить эту проблему?
Заранее спасибо,
Frank