Проверка ListBoxItem, а не ListBox INotifyDataErrorInfo - PullRequest
0 голосов
/ 28 октября 2019

Я попробовал Решения здесь: Проверка ListBoxItem вместо ListBox и WPF ListBox ErrorTemplate и WPF INotifyDataErrorInfo выделение ListBoxItem

У меня естьa ListBox

<ListBox ItemsSource="{Binding ViewNewPanelsPairs}" ItemTemplate="{StaticResource LevelsTemplate}"  Style="{StaticResource PanelsListBox}"
                     SelectionMode="Single"  Margin="10" SelectedItem="{Binding CurrentViewNewPanelsPair, ValidatesOnNotifyDataErrors=True}" ItemContainerStyle="{StaticResource LevelItemTemplate}"/>

со следующими шаблонами элементов и itemcontainerstyle

<DataTemplate x:Key="LevelsTemplate" DataType="{x:Type VM:ViewNewPanelsPair}">
    <CheckBox VerticalContentAlignment="Center"  Content="{Binding View.Name}"   
              IsChecked="{Binding IsViewPanelsNotEmpty, Mode=OneWay}"
              IsHitTestVisible="False"
              IsEnabled="{Binding RelativeSource={RelativeSource Self}, Path=IsChecked}"/>
</DataTemplate>



<Style x:Key="LevelItemTemplate" TargetType="ListBoxItem" >
    <Setter Property="BorderThickness" Value="1" />
    <Setter Property="BorderBrush" Value="Transparent" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding Validation.HasErrors}" Value="True">
            <Setter Property="BorderBrush" Value="Red"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

и последующими проверками (реализация INotifyDataErrorInfo)

public ViewNewPanelsPair CurrentViewNewPanelsPair
    {
        get => currentViewNewPanelsPair;
        set
        {
            Set(() => CurrentViewNewPanelsPair, ref currentViewNewPanelsPair, value);
            ValidateProperty(nameof(CurrentViewNewPanelsPair));
        }
    }

и

protected void ValidateProperty(string PropertyName)
    {
        ClearErrors(PropertyName);
        switch (PropertyName)
        {
            case nameof(ViewNewPanelsPairs):
                if (!ViewNewPanelsPairs.Any(x => x.IsViewPanelsNotEmpty))
                {
                    AddError(PropertyName, "At least one view must have new panels");
                }
                break;
            case nameof(CurrentViewNewPanelsPair):
                if (CurrentViewNewPanelsPair.NewPanels.Count != 0 && CurrentViewNewPanelsPair.NewPanels.Count!=ViewNewPanelsPair.OldPanels.Count)
                {
                    AddError(PropertyName, "New Panels must be equal to Old Panels");
                }
                break;
        }
    }

Независимо от того, как сильно я стараюсь, я всегда выделяю весь список, окруженный красной рамкой при ошибке (не элемент списка, в котором есть ошибка) Что-то не так с моим кодом ??

Примечание: я отлаженкод, чтобы убедиться, что на самом деле есть ошибка, и она была показана, и она отображает ее в виде рамки вокруг всего списка

1 Ответ

0 голосов
/ 29 октября 2019

Это сработало, когда я реализовал INotifyDataErrorinfo в своем классе модели "ViewNewPaanelsPair" и привязал источник данных itemscontrolcontainer к свойству, которое вызывает ошибку, подобную этой:

<DataTrigger Binding="{Binding NewPanels}" > <Setter Property="BorderBrush" Value="Red"/> </DataTrigger>

Спасибо @Andy заваша помощь

...