【问题标题】:Binding not refresing when I set the variable in the setter当我在设置器中设置变量时绑定不刷新
【发布时间】:2012-01-15 17:54:44
【问题描述】:

我有一个文本绑定到如下属性

用户需要输入文件名。然而,有时用户可能会输入无效字符。所以我在 View Model 中的支持属性如下所示

private string outputFileName;
public string OutputFileName
    {
        get 
        {
            return outputFileName;
        }
        set 
        {
            string temp = value;
            if (true == IsValidFileName(temp))// this function uses Path.Getinvalidfilechars
            {
                outputFileName = value;

            }
            else
            {
                MessageBox.Show(string.Format("{0} contains one or more invalid characters  
                for a file Name",temp));
            }
            base.OnPropertyChanged("OutputFileName");
        }
    }

这是问题所在,文本框仍然显示无效字符。为什么 OnPropertyChanged 不会导致文本框中的文本返回到没有无效字符的旧值。 我怎样才能得到这种行为

【问题讨论】:

  • o.O 请删除true == ...
  • 来自 setter 的 MessageBox 是......有点吓人......更好的方法可能是接受该值,并单独验证。就数据绑定而言,它只是成功地分配了值,因此它认为它已经“知道”该值
  • 为什么会有任何不同?
  • @Rahul 发给谁?

标签: c# wpf data-binding


【解决方案1】:

在 else 语句中,OutputFileName 的支持字段没有被分配不同的值。如果要恢复到以前的值,请将其保存在另一个变量中并更新 else 语句中的支持字段,然后属性更改事件将使用旧值更改 UI。虽然,我认为这不是很好的用户体验。

更好的解决方案是使用一些验证器并通知用户需要更正输入,而不是仅仅将值恢复为之前的值。

谷歌搜索“wpf 验证”或从这个 SO 问题开始:WPF Data Binding and Validation Rules Best Practices

【讨论】:

  • 这正是他想要的:不设置支持字段,而是 - 在 TextBox 中 - 恢复为属性的当前值,即未更改的字段值。正如我写的那样,如果他直接调用 INotifyPropertyChanged.PropertyChanged 就可以了。
【解决方案2】:

定义 OutputFileName 的类的基类是什么?该类的 OnPropertyChange 方法似乎在触发 PropertyChanged 事件之前检查属性值是否真的发生了变化。我用一个直接实现 INotifyPropertyChanged 的​​类尝试了你的示例,并且确实

if (PropertyChanged != null)
{
    PropertyChanged(this, new PropertyChangedEventArgs("OutputFileName"));
}

这正如您所期望的那样工作。尽管我同意 Marc 的观点,但从属性设置器中显示 MessageBox 并不常见。

【讨论】:

    猜你喜欢
    • 2011-06-23
    • 2019-08-02
    • 2021-12-27
    • 2015-07-03
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    相关资源
    最近更新 更多