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