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

时间:2016-01-16 22:54:04

标签: c# wpf data-binding

我的类包含address属性(字符串类型),但我的WPF窗口包含一些地址的文本框(门牌号,街道名称和可选的第二行地址 - 城镇和邮政编码确实有单独的班上的字段)。 我希望将它们全部放入类中的单个address字符串中,用逗号分隔(例如“43,Whitefield Road,Princesshire”)。有没有办法通过绑定或仅在代码中手动执行此操作?

enter image description here

3 个答案:

答案 0 :(得分:1)

将所有字段绑定到类的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; }

    ...
}

然后,当您执行转换时,只需使用,分隔符拆分字符串并返回SubStringIdx指定的子字符串:

address.Split(',')[SubStringIdx]

当您绑定到可编辑控件时,您需要确保为IValueConverter.ConvertIValueConverter.ConvertBack方法提供实现。

为了更进一步,您可以在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%正确但你应该得到它的要点。

答案 1 :(得分:0)

使用MultiBinding:

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

<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>

其中使用 elementbinding 其他文本框的文本绑定到finaltextbox(地址), YourAddressConverter 是一个转换器,它将包含地址组件串联的登录名,如下所示它的转换方法。

public class YourAddressConverter : IMultiValueConverter
{

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return values[0].ToString() + " " + values[1].ToString();
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

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

答案 2 :(得分:0)

如果您创建一个Address对象,其中包含门牌号,街道名称,邮政编码等的单独字段,您可以单独绑定每个字段。

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

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);
    }
}