定义ComboBox n#39;当Editable为True时,DataTemplate for TextBox(并定义搜索模式)?

时间:2014-06-10 11:42:07

标签: wpf xaml combobox

我有一个ComboBox,其ItemsSource绑定到一个集合,而SelectedItem绑定到我的VieModel的属性。我们在AvailableOptions中调用绑定属性TargetOptionViewModel。收集项的类型和TargetOption称为MyOption。我有这样的要求,但我不知道如何实现这些要求:

  1. 绑定TargetOption的值为NULL
  2. 应该没问题
  3. 我想为DataTemplate集合中的目标类型设置TargetOption以显示在ComboBox
  4. 如果可能,我希望DataTemplate使用不同的MyOption,然后在ComboBox的下拉列表中选择一个项目。因为我的UserControl空间有限,所以在选择项目时它应该是紧凑的,在选择期间它应该提供更多信息
  5. 正如我所说,我不知道如何做所有这些。起初我有这样的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对象

    我看到如果我为IsEditableComboBox设置为True,并将TextSearch.TextPath设置为Code,则会允许文本快速搜索/分配,并允许搜索文本被完全删除时具有NULL值。但是现在当我选择一个时,它只显示CodeOptionTemplate不再有任何效果,因为现在它在TextBox中显示所选项目。这不好,因为只有Code不足以让用户知道它是Option。但由于我在MyOption类中有多个属性,如何为DataTemplate定义TextBox并定义搜索例程?

1 个答案:

答案 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>

也许如果您尝试澄清剩下的问题(在您的问题中),我可能会理解?