c# - ComboBox - 从两个属性中选择对象

标签 c# wpf xaml data-binding combobox

我希望我的用户能够从 WPF 中的 ComboBox 选择一个客户端(自定义对象)。 ComboBox 将按名字(字符串)和姓氏(字符串)显示所有客户。

所以基本上我的 ViewModel 公开了一个单一的客户端,它是用户将做出的选择,以及一个用于填充 ComboBox 的所有客户端的列表。 ComboBox 的声明如下所示:

<ComboBox Grid.Row="3" Grid.Column="1" Text="{Binding Client}" ItemsSource="{Binding Clients}" IsEditable="True">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <TextBlock.Text>
                    <MultiBinding StringFormat="{}{0} {1}">
                        <Binding Path="FirstName"/>
                        <Binding Path="LastName"/>
                    </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

当然这不起作用,因为 Text 属性显示原始客户端(显示类型名称),如果用户键入名称,则无法将其转换为客户端。这似乎是一件非常简单的事情,但通过在线搜索我似乎找到了许多不同的解决方案:创建一个具有正确格式名称的包装器类型,使用值转换器,使用数据模板......我不熟悉所有那些 WPF 技术,所以请帮我找出最好的(希望是简单的!)解决方案。

谢谢!

最佳答案

还有一种更简单的方法可以做到这一点。正如您所说,XAML 绑定(bind)到对象的类型名称,这来自 ToString() 方法。这允许您覆盖该方法并返回所需的格式,而无需复杂的多重绑定(bind)。

protected override ToString()
{
   return String.Format("{0} {1}", FirstName, LastName);
}

也可能是您使用的 Text 属性有误,您需要 SelectedItem?

关于c# - ComboBox - 从两个属性中选择对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8966499/

相关文章:

c# - 如何将元素绑定(bind)到属于控件根元素的属性?

c# - 跨多个 View 共享的 ViewModel

c# - 第一次索引数组太慢了

c# - 使用带有 XAML 绑定(bind)的 StringFormat 将文件夹注入(inject)图像路径

c# - 类设计指南中的算术运算符和方法

c# - 为什么设置大宽度时边框消失?

c# - 相同的绑定(bind)适用于 1 个 XAML 项目,但对另一个无效

c# - 将 xml 文档分割成 block

c# - 在 .NET 中获取/打开临时文件

c# - url重写影响其他链接