[英]Define ComboBox' DataTemplate for TextBox (and define search pattern) when IsEditable is True?
我有一个ComboBox
其ItemsSource
绑定到集合,而SelectedItem
绑定到我的VieModel
的属性。 让我们在ViewModel
调用绑定属性AvailableOptions
和TargetOption
。 收集项目和TargetOption
类型称为MyOption
。 我有这样的要求,但我不知道如何满足所有要求:
TargetOption
值为NULL应该TargetOption
ComboBox
中的TargetOption
集合中的目标类型设置一个DataTemplate
ComboBox
的下拉列表中以及选择一项时使用不同的DataTemplate
作为MyOption
。 由于我的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对象
我看到,如果将ComboBox
IsEditable
设置为True,并将TextSearch.TextPath
设置为Code
,则它允许文本快速搜索/分配,并且在完全删除搜索文本时还可以具有NULL值。 但是现在当我选择一个Code
,它只显示Code
( OptionTemplate
不再有任何作用,因为现在它在TextBox
显示选定的项目)。 这是不好的,因为仅Code
不足以使用户知道它是什么Option
。 但是,由于MyOption
类中有多个属性,如何定义TextBox
的DataTemplate
并定义搜索例程?
老实说,我不完全了解您的第一个要求及其后果。 但是,我实际上只是在答复您,让您知道您甚至不需要使用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>
此外,如果使用MultiDataTrigger
,则只需一个TextBlock
就可以完成所有这些数据绑定:
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}|{1}">
<Binding Path="ShortName" />
<Binding Path="Code" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
也许,如果您尝试澄清遗留的问题(您的问题),我可能会理解?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.