如何将2个文本框绑定到一个属性?

时间:2014-02-15 17:38:15

标签: c# xaml binding

我有一个属性PhoneNumber,在UI中,我有2个文本框,一个是前缀,另一个是后缀,如何将其绑定到属性? (DataContext中的属性)。

<TextBox Grid.Column="0" MaxLength="3" /> //Prefix
<TextBlock Grid.Column="1" Text="-" />
<TextBox Grid.Column="2" /> //Postfix

enter image description here

我看到它工作的唯一方法是使用textbox1.Text + textbox2.Text后面的代码...有更好的方法吗?

提前致谢:)

2 个答案:

答案 0 :(得分:4)

在数据上下文中再使用两个属性

代码未被编译或测试

public string PhoneNumber { get; set; }
public string Prefix
{
    get
    {
        return PhoneNumber.Substring(0, 3);
    }
    set
    {
        // replace the first three chars of PhoneNumber
        PhoneNumber = value + PhoneNumber.Substring(3);
    }
}
public string Postfix
{
    get
    {
        return PhoneNumber.Substring(3);
    }
    set
    { 
        // replace the  chars of starting from index 3 of PhoneNumber
        PhoneNumber =  PhoneNumber.Substring(0, 3) + value;
    }
}

答案 1 :(得分:2)

我认为您可以将Converter用于此目的,单向的示例可能如下所示:

在这个我的号码是string 000-000000,但你肯定可以改变它。

在XAML中:

<Window.Resources>
    <conv:PostixConverter x:Key="PostfixConv" xmlns:conv="clr-namespace:Example.Converters"/>
    <conv:PrefixConverter x:Key="PrefixConv" xmlns:conv="clr-namespace:Example.Converters"/>
</Window.Resources>
<StackPanel>     
    <TextBox  MaxLength="3" Text="{Binding Number, Converter={StaticResource PrefixConv}}"/> 
    <TextBlock  Text="-" />
    <TextBox Text="{Binding Number, Converter={StaticResource PostfixConv}}"/>
</StackPanel>

在代码背后:

namespace Example.Converters
{
  public class PrefixConverter : IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null) return null;
        else return ((string)value).Substring(0, 3);
    }

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

  public class PostixConverter : IValueConverter
  {
      public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
      {
        if (value == null) return null;
        else return ((string)value).Substring(4);
      }

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