Dan*_*rth 7 .net c# validation wpf
我有一个表示多个选项和实现的ViewModel IDataErrorInfo.此ViewModel仅在选择了至少其中一个选项时才有效.它必然是一个ContentControl.A DataTemplate用于将ViewModel可视化为GroupBox包含ItemsControl.另一个DataTemplate将每个选项可视化为CheckBox.
在选中或取消选中复选框时,我需要做什么,ContentControl一起完成工作IDataErrorInfo并检查有效性?
一些代码:
捆绑:
<ContentControl Content="{Binding GeneralInvoiceTypes, ValidatesOnDataErrors=True}"
Margin="0,0,5,0" />
Run Code Online (Sandbox Code Playgroud)
数据模板:
<DataTemplate DataType="{x:Type ViewModels:MultipleOptionsViewModel}">
<GroupBox Header="{Binding Title}">
<ItemsControl ItemsSource="{Binding Options}" />
</GroupBox>
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:OptionViewModel}">
<CheckBox IsChecked="{Binding IsChecked}"
Content="{Binding Name}"
Margin="6,3,3,0" />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
样式:
<Style TargetType="{x:Type ContentControl}">
<Style.Triggers>
<Trigger Property="Validation.HasError"
Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
</Style.Triggers>
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="90*" />
<ColumnDefinition Width="20" />
</Grid.ColumnDefinitions>
<Border BorderBrush="Red"
BorderThickness="1"
CornerRadius="2.75"
Grid.Column="0">
<AdornedElementPlaceholder Grid.Column="0" />
</Border>
<TextBlock Foreground="Red"
Grid.Column="1"
Margin="0"
FontSize="12"
VerticalAlignment="Center"
HorizontalAlignment="Left"
x:Name="txtError">
*
</TextBlock>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
根据给出的答案,我这样解决了:
更改 的DataTemplate来MultipleOptionsViewModel绑定Options属性ValidatesOnDataErrors=True:
<DataTemplate DataType="{x:Type ViewModels:MultipleOptionsViewModel}">
<GroupBox Header="{Binding Title}">
<ItemsControl ItemsSource="{Binding Options,
ValidatesOnDataErrors=True}"/>
</GroupBox>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)将错误样式更改为 targetItemsControl而不是ContentControl.
MultipleOptionsViewModel引发 PropertyChanged"Options"MultipleOptionsViewModel列作出反应if ,即在其索引器中。"Options"IDataErrorInfo.Item该解决方案的优点是,它使用 的默认行为IDataErrorInfo,即该 ViewModel 的使用者不需要对其进行任何特殊处理。
我知道这个解决方案并不 100% 等同于我在问题中提出的问题 - 错误模板现在显示在组框内而不是周围,但这是我可以忍受的。
| 归档时间: |
|
| 查看次数: |
997 次 |
| 最近记录: |