如果此问题已经得到回答,我深表歉意。我一直在努力寻找实现方法,而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?
}
}
有人知道实现此目标的更好方法吗?
答案 0 :(得分:0)
恕我直言,实施唯一性的最佳方法是让数据库来做到这一点。 ID听起来像是表的主键,因此,如果您尝试创建重复项,数据库将引发异常。捕获错误并将其转换为用户友好的验证消息。
如果您依赖UI,则有两个用户创建相同ID的风险。