проверка элемента дерева - PullRequest
3 голосов
/ 19 июля 2011

Я пытаюсь проверить элементы внутри дерева.Основная идея заключается в том, что пользователь выбирает объект из дерева и загружает его детали, которые можно редактировать.Это все работает нормально, так как я подключил INotifyPropertyChanged, но ... моя модель имеет подключенную логику проверки (IDataErrorInfo), и я хотел бы также показать ее в виде дерева (выделите элемент (ы)которые имеют ошибки валидации).

Я уже пробовал некоторые вещи, но я просто не могу понять, куда поместить валидацию в привязке, чтобы она работала так, как мне бы хотелось.

My Validation 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, но это для меня новая тема, поэтому я не уверен, что это даже путь.

Есть идеи?

1 Ответ

1 голос
/ 11 февраля 2012

Во-первых, вам нужна пара свойств в вашем классе данных, таких как:

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, который указывает, есть ли какие-либо ошибки проверки в объекте данных или нет.

Затем вы можете просто привязать это свойство в вашем Template или Style.Вот пример, который изменил бы цвет Border, если бы связанный объект данных имел какие-либо ошибки проверки.

<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>
...