MVVM Уникальный столбец в DataGrid <-> ObservableCollection - PullRequest
0 голосов
/ 06 ноября 2018

Приношу свои извинения, если на этот вопрос уже был дан ответ. Я изо всех сил пытался выяснить, как реализовать это, и поиски в 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?
    }
}

Кто-нибудь знает лучший способ реализации этого?

1 Ответ

0 голосов
/ 06 ноября 2018

ИМХО лучший способ обеспечить уникальность - позволить базе данных сделать это. Идентификатор звучит как первичный ключ вашей таблицы, поэтому база данных выдаст исключение, если вы попытаетесь создать дубликат. Перехватите ошибку и превратите ее в удобное для пользователя сообщение проверки.

Если вы полагаетесь на свой пользовательский интерфейс, вы рискуете, что два пользователя создадут один и тот же идентификатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...