Показать значение по умолчанию для WPF ComboBox с привязкой к данным - PullRequest
22 голосов
/ 16 декабря 2009

У меня есть поле со списком WPF с привязкой к данным, где я использую свойство SelectedValuePath, чтобы выбрать выбранное значение на основе чего-то другого, чем текст объекта. Это, вероятно, лучше всего объяснить на примере:

<ComboBox ItemsSource="{Binding Path=Items}"
          DisplayMemberPath="Name"
          SelectedValuePath="Id"
          SelectedValue="{Binding Path=SelectedItemId}"/>

Текст данных для этой вещи выглядит так:

DataContext = new MyDataContext
{
    Items = {
        new DataItem{ Name = "Jim", Id = 1 },
        new DataItem{ Name = "Bob", Id = 2 },
    },
    SelectedItemId = -1,
};

Это хорошо, когда я отображаю предварительно заполненные данные, где SelectedItemId совпадает с действительным Item.Id.

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

Возможно ли это? Я мог бы написать некоторый код, чтобы явно пойти и установить SelectedItemId заранее, но кажется неправильным менять мою модель данных из-за недостатка в пользовательском интерфейсе.

Ответы [ 2 ]

9 голосов
/ 16 декабря 2009

Я думаю, что вам придется выполнить некоторую ручную работу здесь, чтобы получить такое поведение. Вы можете проверить код, когда вы впервые отображаете ComboBox, соответствует или нет SelectedItemId или нет, а затем изменить выбранный индекс на основе этого. Или, если вы знаете, что SelectedItemId всегда будет равен -1, когда нет соответствующего элемента, вы можете использовать источник данных.

Метод 1:

if (!DataContext.Items.Exists(l => l.Id == DataContext.SelectedItemId))
{
    MyComboBox.SelectedIndex = 0;  //this selects the first item in the list
}

Метод 2:

<Style TargetType="ComboBox">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=SelectedItemId}" Value="-1">
            <Setter Property="SelectedIndex" Value="0"/>
        </DataTrigger>
    </Style.Triggers>
</Style>
4 голосов
/ 24 октября 2011

вы можете использовать этот стиль триггера: если selecteditem равен нулю, первый элемент выбран.

<Trigger Property="SelectedItem" Value="{x:Null}">
    <Setter Property="SelectedIndex" Value="0"/>
</Trigger>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...