我正在为一个人做一个联系人列表。
我有ItemsControl
使用DataTemplates
来表示不同类型的联系信息。例如。电话号码,电子邮件......等
如果是电话号码,我希望用户拥有 4个文本框,可以编辑数字。 4因为格式(他只能编辑数字,格式是自动生成的):
+43(2)112233 - 2
每个部分都作为TextBox。我想要一个主要TextBox ,并以该格式编写整个数字。这意味着当用户编辑这4个文本框中的一个时,主TextBox将实时填充格式化的数字。
我让它在代码背后工作,但是我现在正在使用DataTemplates,我想在XAML 中实现这个功能。任何想法如何以正确的格式重新生成主TextBox的方式为所有这4个TextBox添加触发器?
答案 0 :(得分:2)
如果我正确地得到了这个并且您不一定需要在主TextBox中编辑电话号码,则可以使用多重绑定来完成此操作。这是一个例子:
<DataTemplate x:Key="PhoneNumberTemplate">
<StackPanel Orientation="Horizontal">
<TextBox Name="tbPN1" />
<TextBox Name="tbPN2" />
<TextBox Name="tbPN3" />
<TextBox Name="tbPN4" />
<TextBox IsReadOnly="True">
<TextBox.Text>
<MultiBinding StringFormat="{}+{0} ({1}) {2} - {3}">
<Binding Path="Text" ElementName="tbPN1" UpdateSourceTrigger="PropertyChanged" />
<Binding Path="Text" ElementName="tbPN2" UpdateSourceTrigger="PropertyChanged" />
<Binding Path="Text" ElementName="tbPN3" UpdateSourceTrigger="PropertyChanged" />
<Binding Path="Text" ElementName="tbPN4" UpdateSourceTrigger="PropertyChanged" />
</MultiBinding>
</TextBox.Text>
</TextBox>
</StackPanel>
</DataTemplate>
每次在其他4个TextBox中的一个按下键时,这将更新主TextBox
<强>更新强>:
为了“更新”数据源,我将执行以下操作:
让PhoneNumber类像这样实现INotifyPropertyChanged:
public class PhoneNumber : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName) {
var handler = PropertyChanged;
if (handler != null) {
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private string m_CountryCode;
public string CountryCode {
get { return m_CountryCode; }
set {
m_CountryCode = value;
ComputeFullNumber();
OnPropertyChanged("CountryCode");
}
}
private string m_AreaCode;
public string AreaCode {
get { return m_AreaCode; }
set {
m_AreaCode = value;
ComputeFullNumber();
OnPropertyChanged("AreaCode");
}
}
private string m_Number;
public string Number {
get { return m_Number; }
set {
m_Number = value;
ComputeFullNumber();
OnPropertyChanged("Number");
}
}
private string m_Suffix;
public string Suffix {
get { return m_Suffix; }
set {
m_Suffix = value;
ComputeFullNumber();
OnPropertyChanged("Suffix");
}
}
public string FullNumber { get; private set; }
private void ComputeFullNumber() {
FullNumber = string.Format("+{0} ({1}) {2} - {3}", m_CountryCode, m_AreaCode, m_Number, m_Suffix);
OnPropertyChanged("FullNumber");
}
}
然后您的DataTemplate变为:
<DataTemplate x:Key="PhoneNumberTemplate">
<StackPanel Orientation="Horizontal">
<TextBox Text="{Binding Path=CountryCode, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Text="{Binding Path=AreaCode, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Text="{Binding Path=Number, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Text="{Binding Path=Suffix, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Text="{Binding Path=FullNumber, Mode=OneWay}" IsReadOnly="True" />
</StackPanel>
</DataTemplate>
答案 1 :(得分:1)
您应该能够将每个TextBox
绑定到相同的基础属性,并使用具有智能的转换器来提取与该TextBox
相关的电话号码部分。伪代码:
<TextBox Text="{Binding PhoneNumber, Converter={StaticResource PhoneNumberConverter, ConverterParameter=CountryCode}}"/>
<TextBox Text="{Binding PhoneNumber, Converter={StaticResource PhoneNumberConverter, ConverterParameter=AreaCode}}"/>
...
如果您正在使用MVVM,请在PhoneNumberViewModel
中使用单独的属性,而不是使用转换器。