UWP TextBox 在键入时不遵守 TwoWay 绑定
UWP TextBox not respecting TwoWay binding when typing
<!-- View -->
<TextBox Text="{Binding str, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
// View Model
private string _str;
public string str
{
get { return _str; }
set
{
if (!value.Contains("a"))
_str = value;
OnPropertyChanged(nameof(str));
}
}
在 TextBox 中键入内容时,我希望它能排除所有无效字符(在本示例中为字母 'a',但它实际上可以用于任何内容)。例如:
- 用户类型 'fds' 后跟 'a'
- str 检测到 a,因此它不会将 _str 设置为 'fdsa',将其保持在 'fds' 但无论如何都会引发事件以指示视图抛出 'a' .
- 在 WPF 中,这会导致包含 'fds' 的文本框。在 UWP 中,这会导致文本框仍然错误地包含 'fdsa'。
似乎在 UWP 中,当控件具有焦点时,它不会遵守 TwoWay 绑定。
我可以创建一个具有 Click 事件的按钮,按下该事件时将正确更新我的 TextBox。
private void btn_Click(object sender, RoutedEventArgs e)
{
OnPropertyChanged(nameof(str));
}
我们有许多需要在 WPF 和 UWP 视图中使用的 ViewModel,而且我们到处都有这种必需的行为。什么是解决这个问题的好方法?
* 编辑 *
周末后回到问题上,似乎已经自行解决。我不知道为什么。我暂时关闭问题。
你可以用一个转换器来解决你的问题,你可以设计一个更好的转换器,在我的例子中我只是用一个愚蠢的转换器来演示我的想法。
转换器:
public class Converter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null)
{
var someString = value.ToString();
return someString.Replace("a", "");
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value;
}
}
XAML
<TextBox Text="{Binding Str, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource converter}}"/>
您也可以使用附加行为。
<!-- View -->
<TextBox Text="{Binding str, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
// View Model
private string _str;
public string str
{
get { return _str; }
set
{
if (!value.Contains("a"))
_str = value;
OnPropertyChanged(nameof(str));
}
}
在 TextBox 中键入内容时,我希望它能排除所有无效字符(在本示例中为字母 'a',但它实际上可以用于任何内容)。例如:
- 用户类型 'fds' 后跟 'a'
- str 检测到 a,因此它不会将 _str 设置为 'fdsa',将其保持在 'fds' 但无论如何都会引发事件以指示视图抛出 'a' .
- 在 WPF 中,这会导致包含 'fds' 的文本框。在 UWP 中,这会导致文本框仍然错误地包含 'fdsa'。
似乎在 UWP 中,当控件具有焦点时,它不会遵守 TwoWay 绑定。
我可以创建一个具有 Click 事件的按钮,按下该事件时将正确更新我的 TextBox。
private void btn_Click(object sender, RoutedEventArgs e)
{
OnPropertyChanged(nameof(str));
}
我们有许多需要在 WPF 和 UWP 视图中使用的 ViewModel,而且我们到处都有这种必需的行为。什么是解决这个问题的好方法?
* 编辑 *
周末后回到问题上,似乎已经自行解决。我不知道为什么。我暂时关闭问题。
你可以用一个转换器来解决你的问题,你可以设计一个更好的转换器,在我的例子中我只是用一个愚蠢的转换器来演示我的想法。
转换器:
public class Converter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null)
{
var someString = value.ToString();
return someString.Replace("a", "");
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value;
}
}
XAML
<TextBox Text="{Binding Str, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource converter}}"/>
您也可以使用附加行为。