键入

时间:2015-11-13 23:31:20

标签: c# textbox uwp

    <!-- 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”。
  4. 在UWP中,当控件具有焦点时,它似乎不会尊重TwoWay绑定。

    我可以创建一个具有Click事件的按钮,按下该事件时将正确更新我的TextBox。

        private void btn_Click(object sender, RoutedEventArgs e)
        {
            OnPropertyChanged(nameof(str));
        }
    

    我们需要在WPF和UWP视图中使用许多ViewModel,并且我们在所有地方都有这种必需的行为。什么是这个问题的好方法?

    *编辑*

    周末之后又回到了问题,似乎已经解决了问题。我不知道为什么。我现在正在结束这个问题。

1 个答案:

答案 0 :(得分:1)

您可以使用转换器来解决您的问题,您可以详细说明一个更好的转换器,在我的示例中,我只是使用一个傻转换器来演示我的想法。

<强>转换器:

 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}}"/>

您也可以使用附加行为。