3

ツリービュー内のアイテムを検証しようとしています。主なアイデアは、ユーザーがツリーからオブジェクトを選択し、編集可能な詳細をロードすることです。私がINotifyPropertyChanged接続しているので、これはすべて正常に機能していますが...私のモデルには検証ロジックが接続されており(IDataErrorInfo)、ツリービューにも表示したいと思います(検証エラーのあるアイテムを強調表示します)。

私はすでにいくつかのことを試しましたが、希望どおりに機能させるために、バインディングのどこに検証を配置するかがわかりません。

私の検証ControlTemplate:

<ControlTemplate x:Key="validationTemplate">
            <StackPanel Orientation="Horizontal">
                <AdornedElementPlaceholder x:Name="MyAdorner" />
                <Image
                                            MaxHeight="{Binding ElementName=MyAdorner, Path=ActualHeight}" 
                                            MaxWidth="20"
                                            Source="{Binding Source={StaticResource ValidationIcon}, Converter={StaticResource UriConverter}}" 
                                            Margin="1" RenderOptions.BitmapScalingMode="HighQuality"
                                            VerticalAlignment="Center" HorizontalAlignment="Center" />
            </StackPanel>
        </ControlTemplate>

treeView:

<TreeView ItemsSource="{Binding Path=ProductCategories}"
              Name="treeView" SelectedItemChanged="treeView_SelectedItemChanged">           
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate DataType="{x:Type data:ProductCategory}"
                                      ItemsSource="{Binding Path=ProductCategories}">
                        <StackPanel Orientation="Horizontal">
                            <StackPanel.Style>
                                <Style TargetType="StackPanel">
                                    <Style.Triggers>
                                        <Trigger Property="Validation.HasError" Value="True">
                                            <Setter Property="ToolTip"
                                                    Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
                                            <Setter Property="Validation.ErrorTemplate"
                                                    Value="{StaticResource validationTemplate}" />
                                        </Trigger>
                                    </Style.Triggers>
                                </Style>
                            </StackPanel.Style>
                            <StackPanel.BindingGroup>
                                <BindingGroup />
                            </StackPanel.BindingGroup>
                            <StackPanel.ToolTip>
                                <TextBlock Margin="2" Text="{Binding Path=Description}" />
                            </StackPanel.ToolTip>
                            <TextBlock Text="{Binding Path=Name}" FontSize="10" FontWeight="Medium" />
                            <TextBlock Text="{Binding Path=ProductCount, StringFormat='   ({0})'}" />
                        </StackPanel>
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView>

基本的に、基になるモデルに検証エラーがある場合は、ツリービューのアイテムの横に小さなアイコンを配置しようとしています。

BindingGroupを試してみましたが、それは私にとって新しいトピックであるため、それが進むべき道であるかどうかはわかりません。

何か案は?

4

1 に答える 1

1

まず、データクラスに次のようないくつかのプロパティが必要です。

public ObservableCollection<string> Errors
{
    get
    {
        ObservableCollection<string> errors = new ObservableCollection<string>();
        errors.AddUniqueIfNotEmpty(this["PropertyToValidate1"]);
        errors.AddUniqueIfNotEmpty(this["PropertyToValidate2"]);
        ...
        errors.AddUniqueIfNotEmpty(this["PropertyToValidateN"]);
        return errors;
    }
}

この最初の1つは、追加されたインデクサーを呼び出し、すべての検証エラーがまだコレクションにない場合は、コレクションにIDataErrorInfo追加します。このメソッドは、「缶に書かれていることを実行する」拡張メソッドです。この部分は自分で管理できると思います。このコレクションの良いところは、単純な実装のように一度に1つだけではなく、それにバインドしてすべての検証エラーのコレクションを表示できることです。AddUniqueIfNotEmptyIDataErrorInfo

public bool HasError
{
    get { return Errors != null && Errors.Count > 0; }
}

bool2番目のプロパティは、データオブジェクトに検証エラーがあるかどうかを示すaを返すだけです。

Template次に、またはでこのプロパティにバインドするだけですStyleBorder関連するデータオブジェクトに検証エラーがあった場合に、の色を変更する例を次に示します。

<Style x:Key="ValidationBorderStyle" TargetType="{x:Type Border}">
    <Setter Property="Border.BorderBrush" Value="Black" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding HasError, FallbackValue=False}" Value="True">
            <Setter Property="Border.BorderBrush" Value="Red" />
        </DataTrigger>
    </Style.Triggers>
</Style>
于 2012-02-11T01:10:22.117 に答える