Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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
如何向WPF组合框添加向下类型支持?_Wpf_Wpf Controls - Fatal编程技术网

如何向WPF组合框添加向下类型支持?

如何向WPF组合框添加向下类型支持?,wpf,wpf-controls,Wpf,Wpf Controls,这是我的组合框: <ComboBox Name="ApplicationList" MinWidth="200" Margin="4" > <ComboBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding ApplicationName}"/>

这是我的组合框:

            <ComboBox Name="ApplicationList" MinWidth="200" Margin="4" >
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding ApplicationName}"/>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>

如果组合框只包含字符串,我将免费获得向下键入支持。但是如何启用复杂对象的向下类型支持

一个解决方法是在模型上重写ToString方法,但我正在寻找一个更通用的解决方案。

我发现您不想在模型中重写ToString,这是有道理的。但是如果将视图和xaml代码绑定到模型,那么您就错过了中间人的好处:ViewModel

在您的情况下,我将使用ViewModel在ApplicationList中包装各个项目。让我们假设ApplicationList是ApplicationModel类型的集合,所以可能是ObservableCollection。如果您将其更改为ObservableCollection,其中每个**ApplicationViewModel都有一个对ApplicationModel的私有引用,那么您可能会对该对象的表示感到疯狂。您可以加入ToString、创建的日期时间以及与用户界面相关的所有内容,而无需对您的模型进行修改

关键是,除了通过对ApplicationViewModel类的严格控制之外,没有任何类可以接触到ApplicationModel类,同时使您能够充分处理与用户界面相关的事情。每节课都这样做,你永远不会回头。另一个好处是,您可以非常轻松地测试模型类,而不受UI内容的影响。

设置属性名称:

<ComboBox Name="ApplicationList" TextSearch.TextPath="ApplicationName" MinWidth="200" Margin="4">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding ApplicationName}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
从文件中:

对以下控件使用此属性: 包含项目的集合。这个 指定属性的值是 用户可以键入以选择的文本 项目,以及 如果控件设置为 在文本框中显示文本


编辑:无需将IsEditable设置为True。

有两种方法可以使其重新工作。如果你正在做一些和你的例子一样简单的事情,你可以设置

DisplayMemberPath="ApplicationName"
而不是指定ItemTemplate

如果需要更多选项来格式化需要使用ItemTemplate的项目,请将TextSearch.TextPath设置为要对其进行文本选择的属性:

TextSearch.TextPath="ApplicationName"

虽然人们给了我很多有趣的想法,但你的想法是唯一一个不需要在对象模型上乱搞的想法。
TextSearch.TextPath="ApplicationName"