У меня есть связанный с данными WPF comboxbox, где я использую SelectedValuePath
свойство для выбора выбранного значения на основе чего-то другого, чем текст объекта. Это, вероятно, лучше всего объяснено с примером:
<ComboBox ItemsSource="{Binding Path=Items}"
DisplayMemberPath="Name"
SelectedValuePath="Id"
SelectedValue="{Binding Path=SelectedItemId}"/>
datacontext для этой вещи похож на это:
DataContext = new MyDataContext
{
Items = {
new DataItem{ Name = "Jim", Id = 1 },
new DataItem{ Name = "Bob", Id = 2 },
},
SelectedItemId = -1,
};
Это - все хорошо и хороший, когда я отображаю предварительно заполненные данные, где SelectedItemId
совпадает с допустимым Item.Id
.
Проблема, в новом случае объекта, где SelectedItemId
неизвестно. То, что делает WPF, показывают поле комбинированного списка пробелом. Я не хочу это. Я хочу запретить пропуски в анкете в поле комбинированного списка; я хотел бы, чтобы это отобразило первый объект в списке.
Действительно ли это возможно? Я мог написать некоторый код, чтобы явно пойти и установить SelectedItemId
заранее, но это не кажется правильным для изменения моей модели данных из-за недостатка в UI.
Я думаю, вам придется поработать вручную, чтобы добиться такого поведения. Вы можете проверить код позади при первом отображении 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>