Приношу свои извинения, если на этот вопрос уже был дан ответ. Я изо всех сил пытался выяснить, как реализовать это, и поиски в Google / StackOverflow не дали мне ответа, соответствующего моим потребностям.
Чтобы обеспечить контекст для таких вещей, как BindableBase -> я использую Prism WPF 7.1
Модель:
public class SampleModel : BindableBase
{
private string _id;
public string ID
{
get => _id;
set => SetProperty(ref _id, value);
}
public string _name;
public string Name
{
get => _name;
set => SetProperty(ref _name, value);
}
public SampleModel()
{
ID = string.Empty;
Name = string.Empty;
}
}
Просмотр модели:
public class SampleViewModel
{
public ObservableCollection<SampleModel> Collection { get; set; }
public SampleModel SelectedEntry { get; set; }
public MainViewModel()
{
Collection = new ObservableCollection<SampleModel>();
}
}
Вид:
<DataGrid Grid.Row="0"
AutoGenerateColumns="False"
ItemsSource="{Binding Collection}"
SelectedItem="{Binding SelectedEntry}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding ID, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
Header="ID"
Width="*"/>
<DataGridTextColumn Binding="{Binding Name}"
Header="Name"
Width="*"/>
</DataGrid.Columns>
Я хотел бы убедиться, что ячейки таблицы данных WPF станут красными, если идентификатор не уникален.
Единственное решение, о котором я могу подумать сейчас, - это добавить указатель на Collection<SampleModel>
для каждого SampleModel
экземпляра, иметь SampleModel
реализовать INotifyDataErrorInfo
и повторять поиск дубликатов в течение System.ComponentModel.DataAnnotations.Validator.TryValidateProperty()
(используя custom UniqueAttribute
). Однако я беспокоюсь, что это не будет правильным решением, поскольку Модель будет связана с Коллекцией, которая ее содержит.
public class UniqueAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
// Validate that property does not exist in collection?
}
}
Кто-нибудь знает лучший способ реализации этого?