Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 控制在数据绑定WPF组合框的文本框部分中显示哪个字段_C#_.net_Wpf_Combobox - Fatal编程技术网

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

C# 控制在数据绑定WPF组合框的文本框部分中显示哪个字段,c#,.net,wpf,combobox,C#,.net,Wpf,Combobox,我在WPF中有一个组合框,它是数据绑定的,并且有控制每个项目如何显示的数据模板。我这样做是为了让每个项目都显示两位文本(用于名称和路径属性)和一个图像(用于图标属性) 当我从组合框中选择一个项目时,组合框的文本框位会变为“TestWPF.Result”,这是我在组合框中填充的类的名称 我对两件事中的一件(或两者)感兴趣: 如何更改它,使其显示其中一个字段的值(例如,使其显示名称字段的值,而不是类的名称) 是否可以让它使用与项目列表中相同的DataTemplate,这样一旦我选择了一个项目,它就会

我在WPF中有一个组合框,它是数据绑定的,并且有控制每个项目如何显示的数据模板。我这样做是为了让每个项目都显示两位文本(用于名称和路径属性)和一个图像(用于图标属性)

当我从组合框中选择一个项目时,组合框的文本框位会变为“TestWPF.Result”,这是我在组合框中填充的类的名称

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

  • 如何更改它,使其显示其中一个字段的值(例如,使其显示名称字段的值,而不是类的名称)

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

  • 更新:

    谢谢你的第一个答案。正如您所描述的,我尝试过使用一个单独的ContentControl,效果很好。现在的问题是如何用这个ContentControl替换ComboBox的textbox部分。任何关于这方面的暗示都是非常受欢迎的

    此外,是否可以将ComboBox控件的textbox位替换为ContentControl和textbox的混合,以便我仍然可以键入textbox以帮助从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>
    
    
    添加
    

    只需将属性绑定表达式放在文本框中,您不需要应用模板

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

    
    
    要以相同的方式显示选定内容,请执行以下操作:
    创建combobox控件模板的副本,您将在那里找到ContentPresenter。将其替换为ContentControl。。不过,这不是正确的解决方案。

    绑定部分是正确的-绑定到数据并使用数据模板以您想要的方式显示源

    至于您的第二个问题,一种方法是使用组合框,如您所用的IsEditable=“True”,并使用TextChanged事件处理程序检查组合框。项是否包含新值,如果不包含,请选择使用Linq搜索匹配项:

    if(comboBox.Items.Contains(e.NewValue)) 返回
    变量匹配= 使用comboBox.Items 选择项 其中,item.BeginsWith(e.NewValue)
    如果(matches.Count>0) comboBox.SelectedItem=matches.First();

    谢谢您的回复。如何将ContentControl放置在文本框的位置?你有一个更大的代码示例,这样我就可以看到如何做到这一点吗?我认为最好发布你的代码,这样我就可以编辑它并向你展示。好了,我现在已经发布了。感谢您的持续帮助:-)对不起,我对WPF还不是很了解。您能告诉我一些有关如何创建ComboBox模板副本并在其中查找ContentPresenter的信息吗?请使用expression blend。。也来看看这个博客
    <ContentControl Content="{Binding ElementName=cmbBox,Path=SelectedValue}" ContentTemplate="{StaticResource robinTemplate}"/>
    
    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();