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