3

我正在尝试验证树视图中的项目。主要思想是用户从树中选择一个对象并加载其可以编辑的详细信息。这一切都很好,因为我已经INotifyPropertyChanged连接了,但是......我的模型已经连接了验证逻辑(IDataErrorInfo),我也想在树视图中显示它(突出显示有验证错误的项目)。

我已经尝试了一些事情,但我只是不知道将验证放在绑定中的哪个位置以使其像我希望的那样工作。

我的验证控制模板:

<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 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;
    }
}

第一个调用添加的索引器IDataErrorInfo并将所有验证错误添加到集合中(如果它们尚未存在)。该AddUniqueIfNotEmpty方法是一种扩展方法,“按照它在锡上说的做”。我相信你可以自己管理这部分。这个集合的好处是您可以绑定到它并查看每个验证错误的集合,而不是像简单的IDataErrorInfo实现那样一次只有一个。

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

第二个属性只返回一个bool表示数据对象中是否存在任何验证错误的 a。

Template然后,您可以在or中简单地绑定到此属性Style。这是一个示例,Border如果相关数据对象有任何验证错误,它将更改 a 的颜色。

<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 回答