Я бы предположил, что element
должен реализовывать INotifyProperyChange, а myClass
должен прослушивать изменения, затем проверять наличие дубликатов, либо генерировать исключения, либо сообщать об ошибке через IDataErrorInfo, INotifyDataErrorInfo или пользовательский индикатор. (так что вы реализуете шаблон Observer, я предполагаю, что myClass здесь является наблюдателем для его элементов).
Для пользовательского способа можно установить свойство «IsDuplicate» в дублирующих элементах и связать его с фоновым (красным) цветом. Это может быть более полезным для пользователя, если он / она намеренно хочет установить здесь повторяющееся имя, а затем хочет исправить какой-то элемент, введенный ранее. Также, если будет проще найти дубликаты, если вы укажете их все в списке.
UPDATE:
Здесь указывается ошибка. Только что измененный элемент имеет рамку, для него дубликаты - красный шрифт.
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsDuplicate}" Value="True">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
<Setter Property="BorderBrush" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
Вот шаблон элемента, примечание ValidatesOnDataErrors
:
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBox Text="{Binding Path=Name, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnDataErrors=True}" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
Вот ваш класс Элемента:
class Element : INotifyPropertyChanged, IDataErrorInfo
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value;
if(PropertyChanged != null)
PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name"));
}
}
private bool _isDuplicate;
public bool IsDuplicate
{
get { return _isDuplicate; }
set
{
_isDuplicate = value;
PropertyChanged.Invoke(this, new PropertyChangedEventArgs("IsDuplicate"));
}
}
//IDataErrorInfo
public event PropertyChangedEventHandler PropertyChanged;
public string this[string columnName]
{
get
{
if (IsDuplicate)
return "Duplicate col" + columnName;
return null;
}
}
public string Error
{
get { return null; }
}
}
И, наконец, myClass
должен прослушать PropertyChanged и вызвать проверку на дублирование.