Wpf 当IsEditable为True时,为TextBox定义ComboBox的数据模板(并定义搜索模式)?

Wpf 当IsEditable为True时,为TextBox定义ComboBox的数据模板(并定义搜索模式)?,wpf,xaml,combobox,Wpf,Xaml,Combobox,我有一个组合框,其ItemsSource绑定到集合,SelectedItem绑定到我的模型的属性。让我们在ViewModel中调用绑定属性AvailableOptions和TargetOption。集合项和目标选项的类型称为MyOption。我有这样的要求,但我不知道如何满足所有要求: 绑定TargetOption的值应该为NULL 我想为组合框中显示的TargetOption集合中的目标类型设置一个DataTemplate 如果可能的话,我希望在ComboBox下拉框中选择一个项目时为MyOp

我有一个组合框,其ItemsSource绑定到集合,SelectedItem绑定到我的模型的属性。让我们在ViewModel中调用绑定属性AvailableOptions和TargetOption。集合项和目标选项的类型称为MyOption。我有这样的要求,但我不知道如何满足所有要求:

绑定TargetOption的值应该为NULL 我想为组合框中显示的TargetOption集合中的目标类型设置一个DataTemplate 如果可能的话,我希望在ComboBox下拉框中选择一个项目时为MyOption使用不同的DataTemplate。因为我的UserControl空间有限,所以在选择项目时它应该是紧凑的,在选择期间它应该提供更多信息 正如我所说,我不知道如何做所有这些。首先,我有这样的XAML:

<ComboBox SelectedItem="{Binding SelectedOption} ItemsSource="{Binding AvailableOptions}" >                          
    <ComboBox.ItemTemplateSelector>
        <MyNameSpace:ComboBoxItemTemplateSelector ItemTemplate="{StaticResource OptionDetailTemplate}" SelectedItemTemplate="{StaticResource OptionSimpleTemplate}" />
    </ComboBox.ItemTemplateSelector>
</ComboBox>
<DataTemplate x:Key="OptionDetailTemplate">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding ShortName}" />
        <TextBlock Text=" | " />
        <TextBlock Text="{Binding Code}" />
    </StackPanel>
</DataTemplate>
<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>
选项SimpleTemplate如下所示:

<ComboBox SelectedItem="{Binding SelectedOption} ItemsSource="{Binding AvailableOptions}" >                          
    <ComboBox.ItemTemplateSelector>
        <MyNameSpace:ComboBoxItemTemplateSelector ItemTemplate="{StaticResource OptionDetailTemplate}" SelectedItemTemplate="{StaticResource OptionSimpleTemplate}" />
    </ComboBox.ItemTemplateSelector>
</ComboBox>
<DataTemplate x:Key="OptionDetailTemplate">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding ShortName}" />
        <TextBlock Text=" | " />
        <TextBlock Text="{Binding Code}" />
    </StackPanel>
</DataTemplate>
<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。当用户从组合框的下拉列表中选择一个选项时,他不能将其设置为NULL,这是允许的。这是因为AvailableOption没有空对象


我发现,如果我将组合框的IsEditable设置为True,并将TextSearch.TextPath设置为Code,则它允许文本快速搜索/分配,并允许在搜索文本完全删除时具有空值。但现在当我选择一个选项时,它只显示代码OptionTemplate不再有任何效果,因为现在它在文本框中显示所选项目。这是不好的,因为只有代码不足以让用户知道它是什么选项。但是由于我在MyOption类中有多个属性,我如何定义文本框的DataTemplate和搜索例程呢?

老实说,我没有完全理解您的第一个要求及其后果。然而,我只是想让您知道,您甚至不需要使用DataTemplateSelector在两个DataTemplates之间进行选择。如果未对其设置x:Key值,则它们将隐式应用于相关项:

<DataTemplate DataType="{x:Type YourXamlNamespacePrefix:TargetOption}">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding ShortName}" />
        <TextBlock Text=" | " />
        <TextBlock Text="{Binding Code}" />
    </StackPanel>
</DataTemplate>

也许如果你试着澄清你问题中的剩余问题,我可能会理解?

是的。我意识到描述有点模糊。TargetOption不是类的名称,而是类型为MyOption的属性的名称。当然,集合AvailableOptions中的项也是MyOption类型。2,3的要求意味着我希望在下拉框中显示MyOption时使用不同的格式,我希望显示更多信息和信息。我的XAML的第一部分可以满足2和3个需求,但问题来自1个需求。这意味着我希望允许与TargetOption的绑定的值为NULL。在我的第一个XAML代码中,由于没有选择任何项,所以在开始时它是OK的。但是,每当用户从下拉列表中选择一个项目时,他就不能选择返回NULL,因为集合实际上不包含NULL对象。这就是为什么我添加了IsEditable,它向组合框中添加了一个可编辑的文本框。当文本框中的文本被删除时,绑定属性TargetOption将更改为NULL。但是我的问题是我不知道如何为这个文本框定制DataTemplate ItemTemplate不适用于它,因为我想显示/允许用户使用搜索模式而不是文本框中的一个属性你只是想问如何在你的组合框中添加一个空项吗,使用IsEnabled的主要目的是允许将空项分配给SelectedItem绑定属性。但同时,具有自动完成功能的用户可编辑文本框也可能有用。因此,如果可能的话,我想使用IsEnabled。我想知道如何定制这个文本框中的显示格式。所谓自定义,我指的是它在文本框中为所选内容显示的内容,以及它使用的搜索模式