繁体   English   中英

当IsEditable为True时,为TextBox定义ComboBox的DataTemplate(并定义搜索模式)?

[英]Define ComboBox' DataTemplate for TextBox (and define search pattern) when IsEditable is True?

我有一个ComboBoxItemsSource绑定到集合,而SelectedItem绑定到我的VieModel的属性。 让我们在ViewModel调用绑定属性AvailableOptionsTargetOption 收集项目和TargetOption类型称为MyOption 我有这样的要求,但我不知道如何满足所有要求:

  1. 绑定TargetOption值为NULL应该TargetOption
  2. 我想为要显示在ComboBox中的TargetOption集合中的目标类型设置一个DataTemplate
  3. 如果可能,我想在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 ,它只显示CodeOptionTemplate不再有任何作用,因为现在它在TextBox显示选定的项目)。 这是不好的,因为仅Code不足以使用户知道它是什么Option 但是,由于MyOption类中有多个属性,如何定义TextBoxDataTemplate并定义搜索例程?

老实说,我不完全了解您的第一个要求及其后果。 但是,我实际上只是在答复您,让您知道您甚至不需要使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM