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',但它实际上可以用于任何内容)。例如:

  1. 用户类型 'fds' 后跟 'a'
  2. str 检测到 a,因此它不会将 _str 设置为 'fdsa',将其保持在 'fds' 但无论如何都会引发事件以指示视图抛出 'a' .
  3. 在 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}}"/>

您也可以使用附加行为。