字母组之间的TextBox自定义空间(用于电话号码)

时间:2013-02-05 10:47:16

标签: c# string windows-phone-7 textbox

我有这个:

<TextBox x:Name="txbPhone" Text="+420" 
         InputScope="TelephoneNumber" Margin="9,0,9,0"/>

现在我想用户写下他的电话号码: +420123456789我想在TextBox中显示+420 123 456 789 我正在考虑通过在用户更改TextBox的值时手动在代码中添加空格来创建它。然后,当我使用它时,我只删除字符串中的所有空格。但我认为这是一个“肮脏”的解决方案。有什么办法可以为此设置一些模板吗?感谢

修改 我在评论中创建了转化器Frederik Winstrup Johansen。所以我创建了我的类(它需要为ConvertBack方法添加代码):

public class PhoneNumberConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var str = (string)value;
        string result;
        if (str[0] == '+')
            result = String.Format("{0:+### ### ### ###}", System.Convert.ToInt64(value));
        else
            result = String.Format("{0:### ### ### ###}", (Int64)value);
        return result;
    }

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

并将我的TextBox更改为:

<TextBox x:Name="txbPhone" Text="{Binding Path=Phone, Converter={StaticResource phoneNumberConverter}, Mode=TwoWay}" 
                 InputScope="TelephoneNumber" Margin="9,0,9,0" TextChanged="txbPhone_TextChanged"/>

这是我的约束力:

        viewModel = new PhonePageViewModel();
        viewModel.Phone = "+420123456";
        this.DataContext = viewModel;

转换器正在运行,但是当我添加一些数字时,它不会更改文本。没有再次调用Convert方法。我怎样才能做到这一点?每当我在TextBox中改变字母时调用Converter?

我的viewmodel类:

namespace SpeedCarsWP.ViewModels
{
    public class PhonePageViewModel : INotifyPropertyChanged
    {
        private string phone;
        public event PropertyChangedEventHandler PropertyChanged;

        public string Phone
        {
            get { return phone; }
            set
            {
                phone = value;
                OnPropertyChanged("Phone");
            }
        }

        public PhonePageViewModel()
        {
        }

        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }


    }
}

2 个答案:

答案 0 :(得分:1)

如果您想使用数据绑定+转换器的解决方案,请实现此功能,它将适合您。 (我尝试了它,但它确实有效。)

首先,在查看XAML-Part:

    <TextBox Height="23" HorizontalAlignment="Left" Margin="78,60,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" 
             Text="{Binding MyProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource MyConverter}}" 
             TextChanged="textBox1_TextChanged" />

UpdateSourceTrigger 代表按字符格式化文本。

第二,ViewModel-Part:

通过VM中的MyProperty,您需要使用 NotifyPropertyChanged 来触发更新。 (如果你不这样做,转换器的转换方法只会在第一次运行一次。)

第三次,转换器部分:

您可以实现转换器主体,如:

        if (value != null)
        {
            string str = value.ToString();
            string result = str;

            if (str.Length == 1)
            {
                result = str.Insert(0, "+");
            }
            if (str.Length == 5 || (str.Length > 5 && (str.Length -1) % 4 == 0))
            {
                result = str.Insert(str.Length-1, " ");
            }

            return result;
        }
        return value;

如果这样做,文本框光标将不在文本的末尾,因此您需要从View的代码隐藏中更正它。

    private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        textBox1.Select(textBox1.Text.Length, 0);
    }

这只是一个快速实现思考解决方案与转换器,但我希望它可以帮助你。

答案 1 :(得分:0)

  

转换器正在运行,但是当我添加一些时,它不会改变文本   数字。没有再次调用Convert方法。我能怎么做   这个?每当我在TextBox中改变字母时调用Converter?

转换器应自动更新。

您确定PhonePageViewModel实施了INotifyPropertyChanged吗? 你是否在PropertyChanged setter中提出了PhonePageViewModel.Phone事件?

你有绑定错误吗? (调试时检查Visual Studio中的输出窗格。)