【问题标题】:UWP TextBox not respecting TwoWay binding when typing键入时 UWP 文本框不尊重双向绑定
【发布时间】:2015-11-13 23:31:19
【问题描述】:
    <!-- 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));
    }

我们有许多 ViewModel 需要在 WPF 和 UWP 视图中使用,而且我们到处都有这种必需的行为。这个问题有什么好的解决方案?

* 编辑 *

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

【问题讨论】:

  • 我认为是UWP相关的一种问题,我看到很多人抱怨uwp上的两种方式绑定,我在桌面应用程序上做了一个测试并且工作正常。也许转换器可以帮助你。
  • 我发现只要我明确设置 UpdateSourceTrigger=PropertyChanged,这总是有效的
  • 你有没有想过为什么会这样?我遇到了这个问题。

标签: c# textbox uwp


【解决方案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}}"/>

您也可以使用附加行为。

【讨论】:

  • 我注意到您之前发布了 WPF 对与 WPF 无关的问题的答案。一定要注意问题标签,为大家节省很多时间,包括你自己。
  • 必须编写一个转换器以使 TwoWay 绑定与 TextBox 一起工作似乎有些过分。
猜你喜欢
  • 1970-01-01
  • 2018-06-12
  • 2016-12-28
  • 2016-10-19
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
相关资源
最近更新 更多