Я пытаюсь создать Combobox с обновляемой коллекцией. Чем я хотел бы отображать специальный контент внутри поля со списком, если коллекция, которая привязывается к полю со списком в нулевом значении.
Я пытался установить параметр TargetNullValue
, но он отображал содержимое не так, как я ожидал.
<ComboBox ItemsSource = "{Binding MyCollection, UpdateSourceTrigger=PropertyChanged, TargetNullValue='No Items'}"/>
Что у меня есть сейчас
Что я ожидаю
@SirRufo Да, но, может быть, должен быть простой способ представить одну строку как один элемент коллекции?
Вы можете заменить шаблон ComboBox, если в нем нет элементов, например. с TextBlock или любым другим визуальным элементом.
<ComboBox>
<ComboBox.Style>
<Style TargetType = "ComboBox">
<Style.Triggers>
<Trigger Property = "HasItems" Value = "False">
<Setter Property = "Template">
<Setter.Value>
<ControlTemplate TargetType = "ComboBox">
<TextBlock Text = "No Items"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
</ComboBox.Style>
</ComboBox>
Хотя этот метод скрывает исходный шаблон, он лучше, потому что не создает другую коллекцию и не изменяет выбранный элемент.
Попробуйте так (сам проверить не могу - компа "под рукой" нет):
<ComboBox>
<ComboBox.Resources>
<CompositeCollection x:Key = "noItems">
<sys:String>No Items</sys:String>
</CompositeCollection>
</ComboBox.Resources>
<ComboBox.Style>
<Style TergetType = "ComboBox">
<Setter Property = "ItemsSource" Value = "{Binding MyCollection}"/>
<Style.Triggers>
<DataTrigger Binding = "{Binding MyCollection.Count}"
Value = "0">
<Setter Property = "ItemsSource" Value = "{DynamicResource noItems}"/>
<Setter Property = "SelectedIndex" Value = "0"/>
</DataTrigger>
</Style.Triggers>
</Style>
<ComboBox.Style>
</ComboBox>
Или такой вариант для TargetNullValue:
<ComboBox>
<ComboBox.ItemsSource>
<Binding Path = "MyCollection">
<Binding.TargetNullValue>
<CompositeCollection>
<sys:String>No Items</sys:String>
</CompositeCollection>
</Binding.TargetNullValue>
</Binding>
</ComboBox.ItemsSource>
</ComboBox>
Поле со списком делает то, что задумано: показывает каждый элемент коллекции. Строка — это набор символов… понял? ;о)