Связанный с данными WPF ComboBox не отображает выбранное значение - PullRequest
3 голосов
/ 28 сентября 2011

У меня есть ComboBox, связанный с DataTable. ComboBox отображает список значений, извлеченных из столбца «wellId» DataTable. ComboBox также стилизован так, что я могу вставить пользовательский элемент в список, просто добавив фиктивную строку в DataTable с полем wellId, установленным в «(settings)».

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

По большей части это прекрасно работает. Он показывает список, и все элементы (включая элементы-пустышки) можно выбрать в раскрывающемся списке.

Однако после выбора элемента из списка, будь то реальный элемент или фиктивный элемент, ComboBox не показывает выбранный элемент должным образом. Вместо отображения того же значения, которое отображается в раскрывающемся списке (столбец «wellId» из DataTable), вместо этого просто отображается строка « System.Data.DataRowView ». Независимо от того, что я выбираю, всегда отображается одно и то же.

Если я специально установлю DisplayMemberPath на ComboBox на «wellId», тогда он правильно отобразит выбранный элемент. Тем не менее, это портит все другие стили, которые я применил, в результате чего раскрывающийся список заполняется пустыми записями.

Как заставить ComboBox правильно отображать выбранный элемент?

1 Ответ

1 голос
/ 28 сентября 2011

Измените ComboBox, чтобы установить ItemTemplate вместо ItemContainerStyle, и удалите IsEditable=True.Если IsEditable=True, то SelectedItem будет отображаться в TextBox, и если TextBox.Text привязан к элементу, он будет отображать .ToString() этого элемента

<ComboBox Name="comboWell" ItemsSource="{Binding }">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <ContentControl>
                <ContentControl.Style>
                    <Style TargetType="{x:Type ContentControl}">
                        <Setter Property="Content" Value="{Binding wellId}" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding wellId}" Value="(settings)">
                                <Setter Property="Content" Value="Customize..." />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentControl.Style>
            </ContentControl>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...