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