C# 当我在setter中设置变量时,绑定没有重新定义

C# 当我在setter中设置变量时,绑定没有重新定义,c#,wpf,data-binding,C#,Wpf,Data Binding,我有一个绑定到属性的文本,如下所示 用户应键入文件名。但是,有时用户可能会键入无效字符。因此,视图模型中的backing属性如下所示 private string outputFileName; public string OutputFileName { get { return outputFileName; } set { string temp =

我有一个绑定到属性的文本,如下所示

用户应键入文件名。但是,有时用户可能会键入无效字符。因此,视图模型中的backing属性如下所示

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不会导致文本框中的文本返回到没有无效字符的旧值。
如何获得该行为

定义OutputFileName的类的基类是什么?该类的OnPropertyChange方法似乎在触发PropertyChanged事件之前检查属性值是否确实发生了更改。我用一个直接实现INotifyPropertyChanged并

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

这正是你所期望的。虽然我同意Marc的观点,但显示属性设置程序的MessageBox是相当少见的

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

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


用谷歌搜索“wpf验证”或从以下问题开始:

o.o请删除设置程序中的
true=
…MessageBox是。。。有点吓人。。。更好的方法可能是接受该值,并单独进行验证。就数据绑定而言,它只是成功地分配了值,因此它认为它“知道”了值。这会有什么不同?@Rahul这是指向谁的?这正是他想要的:不设置支持字段,而是在文本框中恢复到属性的当前值,即未更改的字段值。正如我所写的,如果他直接调用INotifyPropertyChanged.PropertyChanged,这是可行的。