RowValidationRulesマークアップ内に検証ルールを持つDataGridがあります。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;
} }
のviewmodelでプロパティ:
public ObservableCollection<Alias> Aliases { get; set; }
class Alias
{
public string Key { get; set; }
public string Value { get; set; }
}
だからのviewmodelから任意のコマンドを実行しようとした場合私はエイリアスプロパティの行が無効です。 これをどのように消毒することができますか?
Alias ViewModel/ModelでIDataErrorInfoを使用することをおすすめします。私の使用から、検証に失敗した場合、バインディングは更新されません。しかし、私はこの方法が驚いています。実際のItemsControlでバリデーションを行っていますか? – Joe
あなたは、問題はバインディングの代わりにデータグリッドにバリデーションを入れているということですか? –
私はそう思って、私の考えを答えに入れてください。 – Joe