如何为WPF ComboBox添加类型下载支持?

时间:2010-07-10 01:23:28

标签: wpf wpf-controls

这是我的ComboBox:

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

如果组合框只包含字符串,我会免费获得类型下载支持。但是如何为复杂对象启用类型下调支持?

4 个答案:

答案 0 :(得分:4)

TextSearch.TextPath设置为属性名称:

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

来自文档:

  

在控件上使用此属性   包含一组项目。该   指定属性的值是   用户可以键入以选择的文本   项目和文本   如果控件设置为,则显示   在TextBox中显示文本。

编辑:不需要将IsEditable设置为True。

答案 1 :(得分:2)

我发现您不想在模型中覆盖 ToString(),这是有道理的。但是,如果您将查看(xaml代码)绑定到模型,那么您就错过了拥有中间人的好处:视图模型

在您的情况下,我要做的是使用 ViewModel 将单个项目包装在 ApplicationList 中。我们假设 ApplicationList ApplicationModel 类型的集合,因此可能是 ObservableCollection 。如果您将其更改为 ObservableCollection&lt; ** ApplicationViewModel &gt; ,其中每个** ApplicationViewModel 都有对 ApplicationModel 的私人引用,您可能会发疯与该对象的表示。您可以投入 ToString DateTime 创建,以及与用户界面相关的所有内容,而无需使用模型

public class ApplicationViewModel
{
   private ApplicationModel _application;
   private DateTime _creationDate;

   public ApplicationViewModel(ApplicationModel application)
   {
      _application = application;
      _creationDate = DateTime.Now;
   }

   public override string ToString()
   {
      return _application.ApplicationName + ", " + _creationDate.ToString();
   }

}

关键在于,除非通过严格控制 ApplicationViewModel 类,否则任何课程都无法触及您的 ApplicationModel 课程,同时让您充分发挥相关事物的作用到用户界面。每个班级都这样做,你永远不会回头。另一个好处是,您可以非常轻松地测试模型类,而不会妨碍UI的使用。

答案 2 :(得分:2)

有两种方法可以让它再次运作。如果你做的事情实际上和你的例子一样简单,你可以设置

DisplayMemberPath="ApplicationName"

而不是指定ItemTemplate。

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

TextSearch.TextPath="ApplicationName"

答案 3 :(得分:0)

解决方法是覆盖模型上的ToString方法,但我正在寻找更通用的解决方案。