ContentControl中的GroupBox - 支持由绑定到ContentControl的内容实现的IDataErrorInfo

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)

Dan*_*rth 0

根据给出的答案,我这样解决了:

  1. 更改 的DataTemplateMultipleOptionsViewModel绑定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)
  2. 将错误样式更改为 targetItemsControl而不是ContentControl.

  3. 确保在选中或取消选中其中一个子选项时MultipleOptionsViewModel引发 PropertyChanged"Options"
  4. 确保对其实现中的MultipleOptionsViewModel列作出反应if ,即在其索引器中。"Options"IDataErrorInfo.Item

该解决方案的优点是,它使用 的默认行为IDataErrorInfo,即该 ViewModel 的使用者不需要对其进行任何特殊处理。

我知道这个解决方案并不 100% 等同于我在问题中提出的问题 - 错误模板现在显示组框内而不是周围,但这是我可以忍受的。