Подтвердить что ты не робот

Отображение значения по умолчанию для базы данных WPF ComboBox

У меня есть привязка WPF comboxbox, где я использую свойство 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 заранее, но, похоже, не имеет смысла менять мою модель данных из-за недостатка в пользовательском интерфейсе.

4b9b3361

Ответ 1

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

Способ 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>

Ответ 2

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

<Trigger Property="SelectedItem" Value="{x:Null}">
    <Setter Property="SelectedIndex" Value="0"/>
</Trigger>