首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF TextBox文本多触发器

WPF TextBox文本多触发器
EN

Stack Overflow用户
提问于 2009-07-23 08:22:10
回答 2查看 3.6K关注 0票数 1

我在为一个人做一份联系人名单。

我有一个ItemsControl,它使用DataTemplates来处理不同类型的联系信息。例如电话号码电子邮件..。等

如果是电话号码,我希望用户有4 TextBoxes,在那里他可以编辑号码。4由于格式(他只能编辑数字,格式是自动生成的):

+43 (2) 112233 -2

每个部分都是一个TextBox。我想要一个main TextBox ,其中的所有数字都是用格式写的。这意味着当用户编辑这4个TextBox中的一个时,主TextBox实时填充一个格式化的数字。

我让它在后面的代码中工作,但是由于我现在使用的是DataTemplates,所以我想在XAML中实现这个功能。知道如何以正确的格式重新生成主TextBoxes的所有4 TextBox触发器吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-23 09:33:00

如果我正确地理解了这一点,并且您不一定需要编辑主TextBox中的电话号码,那么您可以使用多绑定来完成这一任务。下面是一个示例:

代码语言:javascript
复制
<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中的一个键时更新主TextBoxes。

更新

为了“更新”数据源,我将执行以下操作:

让PhoneNumber类实现如下INotifyPropertyChanged:

代码语言:javascript
复制
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变成:

代码语言:javascript
复制
<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>
票数 2
EN

Stack Overflow用户

发布于 2009-07-23 09:05:56

您应该能够将每个TextBox绑定到相同的底层属性,并使用具有智能的转换器提取出与该TextBox相关的电话号码部分。伪码:

代码语言:javascript
复制
<TextBox Text="{Binding PhoneNumber, Converter={StaticResource PhoneNumberConverter, ConverterParameter=CountryCode}}"/>
<TextBox Text="{Binding PhoneNumber, Converter={StaticResource PhoneNumberConverter, ConverterParameter=AreaCode}}"/>
...

如果您正在执行MVVM,请在PhoneNumberViewModel中使用单独的属性,而不是使用转换器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1170399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档