有没有办法将2个(或更多)WPF项绑定到C#中的单个属性?

有没有办法将2个(或更多)WPF项绑定到C#中的单个属性?,c#,wpf,data-binding,C#,Wpf,Data Binding,我的类包含一个地址属性(字符串类型),但我的WPF窗口包含几个地址文本框(门牌号、街道名称和可选的第二行地址-城镇和邮政编码在类中有单独的字段)。 我想把它们都放在类中的一个地址字符串中,用逗号分隔(例如,“43,Princeshire Whitefield Road”)。有没有办法通过绑定或仅在代码中手动执行 将所有字段绑定到类上的Address属性,然后使用值转换器确定地址的哪些组件适用。在转换器中,有一个属性允许您确定要操作的子字符串: public class AddressSepara

我的类包含一个
地址
属性(字符串类型),但我的WPF窗口包含几个地址文本框(门牌号、街道名称和可选的第二行地址-城镇和邮政编码在类中有单独的字段)。 我想把它们都放在类中的一个
地址
字符串中,用逗号分隔(例如,“43,Princeshire Whitefield Road”)。有没有办法通过绑定或仅在代码中手动执行


将所有字段绑定到类上的Address属性,然后使用值转换器确定地址的哪些组件适用。在转换器中,有一个属性允许您确定要操作的子字符串:

public class AddressSeparatorConverter : IValueConverter
{
    ///<summary>
    /// Index of the substring element of the address to be manipulated (read/edited).
    ///</summary>
    public int SubStringIdx { get; set; }

    ...
}
在绑定到可编辑控件时,需要确保为和方法提供实现

为了更进一步,您可以在Converters.xaml文件中提供不同的转换器定义,以处理地址的不同子组件:

<converters:AddressSeparatorConverter x:Key="AddressToHouseNumberConverter" SubStringIdx="0"/>
<converters:AddressSeparatorConverter x:Key="AddressToStreetNameConverter" SubStringIdx="1"/>
...

...
然后,当绑定到控件时,您可以通过其键调用相应的转换器:

<TextBox Text="{Binding Address, Converter={StaticResource AddressToStreetNameConverter}}"/>

我现在没有访问IDE的权限,因此请接受代码片段可能不是100%正确,但您应该了解其要点。

使用多重绑定:

地址文本框文本绑定的语法为:

<TextBox Width="100" >
        <TextBox.Text>
            <MultiBinding Converter="{StaticResource YourAddressConverter}">
                //order below bindings as you want them in the array passed to converter
                <Binding ElementName="Houseblock" Path="Text"/>
                <Binding ElementName="streetblock" Path="Text"/>
                 .......................
                <Binding ElementName="townblock" Path="Text"/>
            </MultiBinding>
        </TextBox.Text>
    </TextBox>

这是最简单、最好的解决方案。

如果您创建了一个
地址
对象,其中包含独立的门牌号、街道名称、邮政编码等字段。您可以分别绑定到每个字段

如果要打印出整个地址,请创建一个只读属性,该属性将地址的各个部分组合成一个字符串:

public string SingleLineFormat
{
    get
    {
        return string.Format("{0} {1}, {2}, {3}", this.Number, this.Street, this.Town, this.PostCode);
    }
}
您甚至可以使用不同的版本返回跨多行格式化的字符串,或者根据需要使用不同的地址组合

public string MultiLineFormat
{
    get
    {
        return string.Format("{0} {1}{4} {2}{4} {3}", this.Number, this.Street, this.Town, this.PostCode, Environment.NewLine);
    }
}

你最好让你的模型反映出你是如何需要这些约束的。您可以使用一个单独的类将这些属性中的每一个公开为属性,然后它可以将这些属性转换为单个字符串。我同意。您可以使用如下所示的转换器,但这确实是您应该能够在没有视图妨碍的情况下进行单元测试的东西。如果您发现自己必须使用转换器来实现除最基本的逻辑之外的任何功能,那么这通常是一个好迹象,表明您绑定到的模型(例如mvvm中的视图模型)没有正常工作。老实说,尽管我已经提出了将地址作为单个字段的解决方案,因为它实际上是一个复合字段,所以将其拆分为单独的属性会更干净。
public string SingleLineFormat
{
    get
    {
        return string.Format("{0} {1}, {2}, {3}", this.Number, this.Street, this.Town, this.PostCode);
    }
}
public string MultiLineFormat
{
    get
    {
        return string.Format("{0} {1}{4} {2}{4} {3}", this.Number, this.Street, this.Town, this.PostCode, Environment.NewLine);
    }
}