【发布时间】: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',但它实际上可以用于任何内容)。例如:
- 用户键入“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));
}
我们有许多 ViewModel 需要在 WPF 和 UWP 视图中使用,而且我们到处都有这种必需的行为。这个问题有什么好的解决方案?
* 编辑 *
周末后回到问题,它似乎已经解决了。我不知道为什么。我现在结束这个问题。
【问题讨论】:
-
我认为是UWP相关的一种问题,我看到很多人抱怨uwp上的两种方式绑定,我在桌面应用程序上做了一个测试并且工作正常。也许转换器可以帮助你。
-
我发现只要我明确设置 UpdateSourceTrigger=PropertyChanged,这总是有效的
-
你有没有想过为什么会这样?我遇到了这个问题。