2010-07-10 76 views
0

这是我的组合框:如何向WPF组合框添加类型向下的支持?

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

如果组合框只包含字符串我获得自由型向下支持。但是,如何为复杂对象启用类型向下的支持?

回答

4

设置TextSearch.TextPath属性名称:

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

从文档:

使用该属性对 包含项目集合的控制。指定属性的 值为 文本,如果该控件设置为 显示文本,则用户可以键入该文本以选择项目 ,并显示文本 。

编辑:设置IsEditable为真是没有必要的。

+0

当人们给了我很多有趣的想法,你的是唯一一个不需要搞乱对象模型的人。 – 2010-07-10 04:07:56

0

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

2

我看你不希望覆盖的ToString()型号,这是有道理的。但是,如果您将查看(xaml代码)绑定到您的模型那么您错过了拥有中间人的好处:ViewModel

我会做你的情况是ApplicationList包装用视图模型的单个项目。我们假设ApplicationListApplicationModel的集合,所以也许ObservableCollection。如果您更改为的ObservableCollection < ** ApplicationViewModel>,其中每个** ApplicationViewModel有一个私有引用的应用模型你可以去疯狂与该对象的代表性。你可以投入ToString,创建日期时间,以及所有与用户界面相关的东西,而不必与你的模型猴子。

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类的严格控制,同时给您提供相关的用户界面的东西打转转完整能力。对每个班级做这个,你永远不会回头。另一个好处是,你可以非常容易地测试你的模型类没有UI的东西妨碍。

2

有两种方法可以再次使用它。如果你正在做的事情与你的例子一样简单,你可以设置

DisplayMemberPath="ApplicationName" 

而不是指定ItemTemplate。

如果您需要格式化你的项目需要使用一个ItemTemplate集TextSearch.TextPath到你想要做的文本选择属性上更多的选择:

TextSearch.TextPath="ApplicationName"