DataGrid <-> ObservableCollection中的MVVM唯一列

时间:2018-11-06 04:04:06

标签: c# wpf mvvm

如果此问题已经得到回答,我深表歉意。我一直在努力寻找实现方法,而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>

我想确保cells of the WPF DataGrid goes red if the ID isn't unique.

我现在唯一想到的解决方案是向每个Collection<SampleModel>实例添加指向SampleModel的指针,让SampleModel实现INotifyDataErrorInfo,并反复寻找在System.ComponentModel.DataAnnotations.Validator.TryValidateProperty()期间重复(使用自定义UniqueAttribute)。但是我担心这不是正确的解决方案,因为模型将与包含它的集合耦合。

public class UniqueAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        // Validate that property does not exist in collection?
    }
}

有人知道实现此目标的更好方法吗?

1 个答案:

答案 0 :(得分:0)

恕我直言,实施唯一性的最佳方法是让数据库来做到这一点。 ID听起来像是表的主键,因此,如果您尝试创建重复项,数据库将引发异常。捕获错误并将其转换为用户友好的验证消息。

如果您依赖UI,则有两个用户创建相同ID的风险。