Почему ListViewItems в ContentControl можно выбирать только для первых нескольких пикселей? - PullRequest
0 голосов
/ 07 июня 2019

Я хочу запросить различные типы свойств у пользователя моего приложения WPF. Поэтому у меня есть ListView, то есть ItemsSource связывается с ObservableCollection<PropertiesBase>. Каждое свойство происходит от PropertiesBase. Поскольку опытный пользователь должен иметь возможность редактировать эти свойства, DataTemplate выбирается в зависимости от свойства EditMode и типа свойства.

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

Выбор работает только на белую часть элемента

Я пытался поиграть с Focusable, но это не привело меня к успеху. Я также скопировал свой xaml ListViewItem непосредственно в Listview (без таблицы данных). Это сработало, как и ожидалось.

ListView XAML:

<ListView ItemsSource="{Binding PropertyList}" HorizontalContentAlignment="Stretch" SelectionMode="Single">
            <ListView.Resources>
                <DataTemplate DataType="{x:Type properties:PasswordProperty}">
                    <ContentControl Content="{Binding}" Background="Red">
                      <ContentControl.Style>
                            <Style TargetType="{x:Type ContentControl}">
                                <Setter Property="ContentTemplate" Value="{StaticResource PasswordPropertyListViewItem}" />
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Path=DataContext.EditMode, RelativeSource= {RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" Value="True">
                                        <Setter Property="ContentTemplate" Value="{StaticResource EditPasswordPropertyListViewItem}" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </ContentControl.Style>
                    </ContentControl>
                </DataTemplate>

Пример ListViewItem XAML, на который ссылается DataTemplate:

<ListViewItem x:Class="PasswordPropertyListViewItem"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008">
    <Border BorderThickness="0,0,0,1"  BorderBrush="DarkGray">
        <DockPanel LastChildFill="True" HorizontalAlignment="Stretch">
            <Label Margin="8" Content="{Binding PropertyName}"></Label>

Я ожидаю, что не имеет значения, где я нажимаю на ListViewItem, но элемент выбирается в любом случае (особенно красная часть изображения выше).

1 Ответ

0 голосов
/ 07 июня 2019

Клеменс предоставил решение в своем комментарии выше. Я действительно вложил два ListViewItems.

Решение состоит в том, чтобы изменить тип моего шаблонного элемента управления наContentControl.

<ContentControl x:Class="PasswordPropertyListViewItem"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008">
    <Border BorderThickness="0,0,0,1"  BorderBrush="DarkGray">
        <DockPanel LastChildFill="True" HorizontalAlignment="Stretch">
            <Label Margin="8" Content="{Binding PropertyName}"></Label>

Спасибо, Клеменс!

...