WPF:属性类似于WinForms Modified

本文关键字:WinForms Modified 类似于 属性 WPF | 更新日期: 2023-09-27 18:16:47

在WinForms控件中,像TextBox这样的控件具有属性Modified,在更改控件的内容后获得值"true",并且可以手动设置为"false"。它们的WPF类似物似乎没有这样的属性(两者都没有以新的命名风格修改)。所以我必须自己处理他们的修改事件还是有更方便的方法?例如,我有几个文本框和一个函数,它将它们的内容合并到一个文档中进行预览。打开预览,我想保留文档的旧内容,如果没有任何文本框被更改,或者如果至少有一个文本框被编辑,则调用该函数来生成新文档的内容。

WPF:属性类似于WinForms Modified

在WPF中,通过ViewModel/Model更容易控制一切…这可能太多了/不是你想要的。但是根据经验,我觉得下面的模式使用起来很容易。包装你的简单数据类(与所有的属性,它现在正在使用/在你的问题现在)在一个类/模型实现IEditableObject, INotifyPropertyChanged和可能是公平的。让我们把你的类命名为Data。在包装器类中创建字段:

Data _current;
Data _proposed;
Data _previous;

IEditableObject要求你实现BeginEdit(), EndEdit()和CancelEdit()。在它们中,您需要控制状态_current, proposed和previous。例如

public void CancelEdit()
{
   _current = _previous;
   _proposed = null;
}
public void EndEdit()
{
   _previous = _proposed;
}
public void BeginEdit()
{
    _proposed = _current;
}

在上面的方法中你可能需要更多的逻辑,所以这只是一个例子。知道你的对象是否有变化的关键是实现一个标志,很多人称之为IsDirty:

pubic bool IsDirty { get { return _current != _previous; } }

现在这个类的用户可以很容易地检查状态。哦,还有,每个属性都有以下机制:

public string Example
{
   get { return _current.Example;}}
   set
       {
          if(_current.Example == value) return;
          BeginEdit();
          _current.Example = value;
          RaisePropertyChanged (() -> Example);
       }
    }

实现IEditableObject的好处是什么,所有的控件都响应它,DataGrid是一个很好的例子,你也可以很容易地通过取消编辑返回到原始状态。无论如何,您应该浏览许多示例。我只是希望能让你开始走上这条道路……附注:这种模式在WPF出现之前就已经使用了,在WinForms中也非常常见

WPF没有,因为UI不是数据,因此您的UI不是存储有关数据是否更改的信息的正确位置。

蹩脚的恐龙winforms不允许UI和应用程序逻辑/数据之间的干净和真正的分离,因此有各种可怕的黑客为了把这些完全独立的概念混在一起。

你必须学会正确地开发,使用MVVM模式。然后,您将意识到在任何UI元素上放置状态数据是没有意义的。