0

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

4

2 回答 2

0

在 WPF 中,通过 ViewModel/Model 控制一切更容易......这可能太多/不是您想要的。但是通过经验,我觉得下面的模式很容易使用。将您的简单数据类(以及它现在使用的/现在在您的问题中的所有属性)包装在实现 IEditableObject、INotifyPropertyChanged 和可能的 IEquitable 的类/模型中。让我们调用你的类数据。在包装类中创建字段:

Data _current;
Data _proposed;
Data _previous;

IEditableObject 要求您实现 BeginEdit()、EndEdit() 和 CancelEdit()。在它们中,您需要控制状态 _current、provided 和 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 就是一个很好的例子,并且您可以通过取消编辑轻松返回原始状态。无论如何,您应该浏览很多示例。我只是希望能让你开始走上这条路...... PS这种模式在WPF出现之前就已经使用过了,它在WinForms中也很常见

于 2013-06-02T15:01:29.813 回答
0

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

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

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

于 2013-06-02T17:34:30.323 回答