控制哪个字段显示在数据绑定WPF ComboBox的文本框部分中

时间:2009-02-06 18:56:55

标签: c# .net wpf combobox

我在WPF中有一个ComatabBox,它是数据绑定的,并且有数据模板,用于控制每个项目的显示方式。我已经做了这样,每个项目都显示两位文本(对于Name和Path属性)和一个图像(对于Icon属性)。

当我从ComboBox中选择一个项目时,ComboBox的文本框位改为说“TestWPF.Result”,这是我用ComboBox填充的类的名称。

我对两件事中的一件(或两件)感兴趣:

  1. 如何更改它以便显示其中一个字段的值(例如,它显示Name字段的值而不是类的名称)?

  2. 是否可以让它在项目列表中使用相同的DataTemplate,这样一旦我选择了一个项目,它就会在关闭的ComboBox中以与在项目列表中查找相同的方式显示。基本上我有一个名为ShowResults的DataTemplate和一个使用该模板的ComboBox。我还添加了一个单独的ContentControl,我必须在ComboBox中显示所选项目的详细信息,但我希望用它来替换ComboBox中的文本框。

  3. 更新

    感谢您的第一个答案。我已经尝试过使用单独的ContentControl,正如您所描述的那样,它运行正常。现在的问题是如何用这个ContentControl替换ComboBox的文本框部分。对此的任何暗示都是最受欢迎的。

    此外,是否可以使用ContentControl和文本框的混合替换ComboBox控件的文本框位,这样我仍然可以键入文本框以帮助从ComboBox中选择项目,但是当我关闭时下拉其余的ContentControl位将填充其余的文本和图标。希望这是有道理的 - 如果没有,请提出问题!

    代码:

    我被要求发布我的代码 - 所以在这里。我试图删除我知道绝对不相关的东西,但我不确定究竟什么是相关的,所以如果有疑问我就把事情留在了里面。

    <Window x:Class="TestWPF.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:custom="clr-namespace:TestWPF"
    Title="Window1" Height="300" Width="843" Loaded="Window_Loaded">
    <Window.Resources>
        <DataTemplate x:Key="ShowResult" DataType="TestWPF.Result">
            <StackPanel Margin="5" Orientation="Horizontal">
                <Image Width="32" Height="32"  Source="{Binding Path=Image}"/>
                <StackPanel Margin="5">
                    <TextBlock FontWeight="Bold" Text="{Binding Path=Name}"/>                    
                    <TextBlock Text="{Binding Path=Path}"/>
                </StackPanel>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>
    
    <Grid Width="786">
        <Button Height="23" HorizontalAlignment="Right" Margin="0,24,166,0" Name="btnTest" VerticalAlignment="Top" Width="75" Click="btnTest_Click">Add</Button>
        <ComboBox StaysOpenOnEdit="True"  DropDownClosed="comboBox1_DropDownClosed" PreviewTextInput="comboBox1_PreviewTextInput" SelectionChanged="comboBox1_SelectionChanged" ItemTemplate="{StaticResource ShowResult}"  Margin="259,109,22,89" Name="comboBox1" IsEditable="True" />
        <ContentControl Height="50" Margin="268,0,22,21" Name="contentControl1" VerticalAlignment="Bottom" Content="{Binding ElementName=comboBox1,Path=SelectedValue}" ContentTemplate="{StaticResource ShowResult}"/>
    </Grid>
    

2 个答案:

答案 0 :(得分:1)

你有绑定部分正确 - 绑定到数据并使用DataTemplate以你想要的方式显示源。

关于你的第二个问题,一种方法是使用一个带有IsEditable =“True”的ComboBox,并使用TextChanged事件处理程序检查comboBox.Items是否包含新值,如果没有检查使用Linq搜索一场比赛:

if (comboBox.Items.Contains(e.NewValue))
    return;
var matches = with comboBox.Items select item where item.BeginsWith(e.NewValue);
if (matches.Count > 0) comboBox.SelectedItem = matches.First();

答案 1 :(得分:0)

只需将Property Binding表达式放置到textBox,您就不需要应用模板。

另一种获取精确数据模板的方法,将ContentControl放在textBox的位置并指定相同的DataTemplate(比如x:Name =“robinTemplate”)

<ContentControl Content="{Binding ElementName=cmbBox,Path=SelectedValue}" ContentTemplate="{StaticResource robinTemplate}"/>

以相同的方式显示所选内容: 创建组合框控件模板的副本,您将在那里找到ContentPresenter。将其替换为ContentControl ..但这不是正确的解决方案。