0

我在 WPF 中有一个 ComboBox,它是数据绑定的,并且有一个数据模板来控制每个项目的显示方式。我已经做到了,每个项目都显示有两位文本(用于名称和路径属性)和一个图像(用于图标属性)。

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

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

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

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

更新:

感谢您的第一个答案。正如您所描述的,我尝试使用单独的 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>

4

2 回答 2

1

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

至于您的第二个问题,一种方法是使用带有 IsEditable="True" 的 ComboBox,并使用 TextChanged 事件处理程序检查 comboBox.Items 是否包含新值,如果不检查则使用 Linq搜索匹配:

if (comboBox.Items.Contains(e.NewValue))
    返回;
var 匹配 = 与 comboBox.Items 选择物品 其中 item.BeginsWith(e.NewValue);
if (matches.Count > 0) comboBox.SelectedItem = 匹配.First();

于 2009-02-06T23:35:13.557 回答
0

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

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

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

为了使选定的内容以相同的方式显示:创建组合框控件模板的副本,您将在那里找到一个 ContentPresenter。用 ContentControl 替换它。虽然这不是正确的解决方案。

于 2009-02-06T19:13:05.177 回答