【发布时间】:2016-08-19 08:31:36
【问题描述】:
我在 RowValidationRules 标记中有一个带有验证规则的 DataGrid。
我想要的是仅在没有验证错误的情况下更新绑定属性,否则应保留旧值。
xaml:
<DataGrid
Margin="10"
CanUserAddRows="True"
CanUserDeleteRows="True"
AutoGenerateColumns="False"
IsReadOnly="False"
ItemsSource="{Binding Source={x:Static services:SharedPropertiesProvider.Instance}, Path=Aliases, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
>
<DataGrid.RowValidationRules>
<validation:AliasValidation />
</DataGrid.RowValidationRules>
<DataGrid.Columns>
<DataGridTextColumn Width="30*" Header="Alias" Binding="{Binding Key, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
<DataGridTextColumn Width="70*" Header="Path" Binding="{Binding Value, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Command="ApplicationCommands.Delete" Width="20" Height="20">
<Button.Content>
<Image Margin="2" Source="/WinLogInspector;component/Assets/1441392968_f-cross_256.png" />
</Button.Content>
</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
验证类:
class AliasValidation : ValidationRule {
public override ValidationResult Validate(object value, CultureInfo cultureInfo) {
if (((BindingGroup)value).Items.Count > 0)
{
Alias item = (value as BindingGroup).Items[0] as Alias;
if (item != null)
{
string aliasPattern = @"^[a-zA-Z]+[a-zA-Z0-9]*$";
string pathPattern = @"^[a-zA-Z0-9\\/@:_\-;]+$";
string key = item.Key ?? String.Empty;
string path = item.Value ?? String.Empty;
bool isValidAlias = Regex.IsMatch(key, aliasPattern);
bool isValidPath = Regex.IsMatch(path, pathPattern);
if (isValidAlias && isValidPath)
return ValidationResult.ValidResult;
else
return new ValidationResult(false, "Invalid alias / path");
}
}
return ValidationResult.ValidResult;
} }
视图模型中的属性:
public ObservableCollection<Alias> Aliases { get; set; }
class Alias
{
public string Key { get; set; }
public string Value { get; set; }
}
因此,如果我尝试从视图模型执行任何命令,我可以看到 Aliases 属性具有无效行。 我该如何消毒?
【问题讨论】:
-
我建议在 Alias ViewModel/Model 中使用 IDataErrorInfo。根据我的使用,如果验证失败,它不会更新绑定。但我很惊讶这种方法确实如此。等等,你是在对实际的 ItemsControl 执行验证吗?
-
你是说问题是我把验证放在Datagrid而不是绑定上?
-
我怀疑是这样,把我的想法变成一个答案。