我有这个:
<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));
}
}
}
}
答案 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中的输出窗格。)