这是我的ComboBox:
<ComboBox Name="ApplicationList" MinWidth="200" Margin="4" >
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding ApplicationName}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
如果组合框只包含字符串,我会免费获得类型下载支持。但是如何为复杂对象启用类型下调支持?
答案 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方法,但我正在寻找更通用的解决方案。