Проблемы со стилем привязки к данным WPF ComboBoxItem - PullRequest
1 голос
/ 27 сентября 2011

У меня есть ComboBox, связанный с DataTable. Я пытаюсь добавить дополнительный ComboBoxItem в верхней части списка, где я могу поставить ссылку для настройки списка. В настоящее время я просто вставляю фиктивную строку в начало моего DataTable, а затем использую DataTrigger в ComboBox, чтобы он выглядел правильно. Тем не менее, я не совсем получаю правильный результат.

Я пробовал два метода. Во-первых, мой DataTrigger заменяет фиктивный элемент на ControlTemplate, который содержит TextBlock.

<ComboBox IsEditable="True" Name="comboWell" ItemsSource="{Binding}" DisplayMemberPath="wellId">
    <ComboBox.ItemContainerStyle>
        <Style TargetType="{x:Type ComboBoxItem}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding wellId}" Value="(settings)">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="ComboBoxItem">
                                <TextBlock Text="Customize..." />
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>

Результат выглядит правильно, но на этом элементе нет подсветки при наведении курсора. Остальная часть списка работает нормально, но этот элемент вообще не реагирует, когда я наводю на него курсор мыши. Я попытался добавить дополнительные триггеры и стили, чтобы применить эффект наведения мыши, но я не получил изменений.

Второй метод, который я попробовал, состоял в том, чтобы просто изменить внешний вид элемента, а не полностью заменить его ControlTemplate.

<ComboBox IsEditable="True" Name="comboWell" ItemsSource="{Binding}" DisplayMemberPath="wellId">
    <ComboBox.ItemContainerStyle>
        <Style TargetType="{x:Type ComboBoxItem}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding wellId}" Value="(settings)">
                    <Setter Property="Content" Value="Customize..." />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>

Этот функционирует как обычный элемент списка, при наведении курсора работает нормально. Тем не менее, элемент пуст. Ни оригинального текста, ни текста, который я пытаюсь установить в DataTrigger, там нет. Нет ошибок, просто пустой элемент списка.

Есть ли лучший способ сделать это?

1 Ответ

2 голосов
/ 27 сентября 2011

Удалите DisplayMemberPath и добавьте содержимое по умолчанию в стиль

<ComboBox IsEditable="True" Name="comboWell" ItemsSource="{Binding }">
    <ComboBox.ItemContainerStyle>
        <Style TargetType="{x:Type ComboBoxItem}">
            <Setter Property="Content" Value="{Binding wellId}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding wellId}" Value="(settings)">
                    <Setter Property="Content" Value="Customize..." />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>

DisplayMemberPath на самом деле является кратким способом сказать, что шаблон элемента должен быть просто TextBlock с его текстом, привязанным к элементу DisplayMemberPath, и я предполагаю, что он перезаписывал все, что у вас было в стиле.

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