WPF INotifyDataErrorInfo выделить ListBoxItem - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть ListBox как таковое:

<ListBox Margin="5" ItemsSource="{Binding NetworkAdapters, Mode=OneWay}" SelectedItem="{Binding SelectedNetworkAdapter}" SelectionChanged="{s:Action SelectedNetworkAdapterChanged}">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="2" VerticalAlignment="Top"/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Ellipse Width="15" Height="15" Margin="5">
                    <Ellipse.Style>
                        <Style TargetType="Ellipse">
                            <Setter Property="Fill" Value="Gray"></Setter>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Status}" Value="{x:Static wpf:NetworkAdapterStatus.Up}">
                                    <Setter Property="Fill" Value="Green"></Setter>
                                </DataTrigger>
                                <DataTrigger Binding="{Binding Status}" Value="{x:Static wpf:NetworkAdapterStatus.Down}">
                                    <Setter Property="Fill" Value="Red"></Setter>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </Ellipse.Style>
                </Ellipse>
                <StackPanel Margin="5,0,0,0">
                    <TextBlock Text="{Binding Name}" FontWeight="Bold"/>
                    <TextBlock Text="{Binding Description}"></TextBlock>
                    <TextBlock Text="{Binding Speed, StringFormat='Speed: {0}'}" FontSize="10"/>
                    <TextBlock Text="{Binding Status}" FontSize="10"/>
                </StackPanel>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

NetworkAdapters - это коллекция моделей просмотра, которые реализуют INotifyDataErrorInfo.

При текущем XAML, если в какой-либо из моделей просмотра возникнет ошибка, все ListBox будет выделено красным, но я бы хотел выделить только один ListBoxItems, содержащий ошибки.

Я рассмотрел похожие вопросы, такие как:

WPF ListBox ErrorTemplate и Проверка элемента ListBoxItem вместо ListBox

Но я все еще не могу сделать эту работу.Буду признателен за любую помощь.


ОБНОВЛЕНИЕ:

Согласно совету Кшиштофа, я попытался обернуть StackPanel вокруг границы и использовать DataTrigger как таковое:

<ListBox.ItemTemplate>
    <DataTemplate>
        <Border BorderThickness="1">
            <Border.Resources>
                <Style TargetType="Border">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding HasErrors}" Value="True">
                            <Setter Property="BorderBrush" Value="Red"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Resources>
            <StackPanel> ... </StackPanel>
        </Border>
    </DataTemplate>
</ListBox.ItemTemplate>

Однако, это производит следующее:

enter image description here

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

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Вам необходимо реализовать ItemContainerStyle, как показано ниже:

    <ListBox.ItemContainerStyle>
        <Style 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>
    </ListBox.ItemContainerStyle>

Это позволит вам изменить границу самого ListBoxItem, чтобы все было так, как вы хотите.

0 голосов
/ 19 декабря 2018

Вы можете забыть об ErrorTemplate и просто использовать DataTrigger для привязки к Validation.HasErrors:

  <StackPanel>
                        <StackPanel.Resources>
                            <Style TargetType="{x:Type StackPanel}" BasedOn="{StaticResource {x:Type StackPanel}}">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Validation.HasErrors}" Value="True"> <!-- change all text to red -->
                                        <Setter Property="Foreground" Value="Red"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </StackPanel.Resources>
</StackPanel>

Если вы хотите выделить, вы можете обернуть StackPanel с помощью Border и установить его цвет на красный в стиле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...