我有一个ComboBox
,其ItemsSource
绑定到一个集合,而SelectedItem
绑定到我的VieModel
的属性。我们在AvailableOptions
中调用绑定属性TargetOption
和ViewModel
。收集项的类型和TargetOption
称为MyOption
。我有这样的要求,但我不知道如何实现这些要求:
TargetOption
的值为NULL DataTemplate
集合中的目标类型设置TargetOption
以显示在ComboBox
DataTemplate
使用不同的MyOption
,然后在ComboBox
的下拉列表中选择一个项目。因为我的UserControl
空间有限,所以在选择项目时它应该是紧凑的,在选择期间它应该提供更多信息正如我所说,我不知道如何做所有这些。起初我有这样的XAML:
<ComboBox SelectedItem="{Binding SelectedOption} ItemsSource="{Binding AvailableOptions}" >
<ComboBox.ItemTemplateSelector>
<MyNameSpace:ComboBoxItemTemplateSelector ItemTemplate="{StaticResource OptionDetailTemplate}" SelectedItemTemplate="{StaticResource OptionSimpleTemplate}" />
</ComboBox.ItemTemplateSelector>
</ComboBox>
使用自定义ItemTemplateSelector
。我能够做到要求2)和3)。我的OptionDetailTemplate
看起来像这样:
<DataTemplate x:Key="OptionDetailTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ShortName}" />
<TextBlock Text=" | " />
<TextBlock Text="{Binding Code}" />
</StackPanel>
</DataTemplate>
和OptionSimpleTemplate
看起来像这样:
<DataTemplate x:Key="OptionSimpleTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ShortName}" />
<TextBlock Text=" | " />
<TextBlock Text="{Binding Code}" />
<TextBlock Text=" | " />
<TextBlock Text="{Binding Number}" />
</StackPanel>
</DataTemplate>
但现在问题是要求1)。当用户从ComboBox
的下拉列表中选择一个选项时,他不能将其作为NULL返回,这应该被允许。这是因为AvailableOption
没有NULL对象
我看到如果我为IsEditable
将ComboBox
设置为True,并将TextSearch.TextPath
设置为Code
,则会允许文本快速搜索/分配,并允许搜索文本被完全删除时具有NULL值。但是现在当我选择一个时,它只显示Code
(OptionTemplate
不再有任何效果,因为现在它在TextBox
中显示所选项目。这不好,因为只有Code
不足以让用户知道它是Option
。但由于我在MyOption
类中有多个属性,如何为DataTemplate
定义TextBox
并定义搜索例程?
答案 0 :(得分:0)
我必须诚实地说,我并不完全理解你的第一个要求及其后果。但是,我真的只是回答让你知道你甚至不需要使用DataTemplateSelector
来选择你的两个DataTemplate
。如果您不在其上设置x:Key
值,则它们将隐式应用于相关项:
<DataTemplate DataType="{x:Type YourXamlNamespacePrefix:TargetOption}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ShortName}" />
<TextBlock Text=" | " />
<TextBlock Text="{Binding Code}" />
</StackPanel>
</DataTemplate>
...
<DataTemplate DataType="{x:Type YourXamlNamespacePrefix:MyOption}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ShortName}" />
<TextBlock Text=" | " />
<TextBlock Text="{Binding Code}" />
<TextBlock Text=" | " />
<TextBlock Text="{Binding Number}" />
</StackPanel>
</DataTemplate>
此外,如果您使用TextBlock
,则可以只使用一个MultiDataTrigger
执行所有此类数据绑定:
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}|{1}">
<Binding Path="ShortName" />
<Binding Path="Code" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
也许如果您尝试澄清剩下的问题(在您的问题中),我可能会理解?