【问题标题】:WPF: property similar to WinForms ModifiedWPF:类似于 WinForms 的属性已修改
【发布时间】:2013-06-02 12:11:02
【问题描述】:

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

【问题讨论】:

  • 感谢您的快速回复,编码器。带有绑定的变体似乎我太冗长了(或者我可能不知道如何优雅地使用它)。我想收到有关其中一个相关控件的第一次更改的通知,这在生成新预览之前就足够了。换句话说,我希望拥有全局属性 DataIsModified,如果某些相关控件被编辑,它将变为 true,并且将停止处理更改事件,直到将其值设置为“false”。你有什么建议?

标签: c# wpf properties


【解决方案1】:

在 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就是一个很好的例子,你也可以通过取消编辑轻松返回到原始状态。 无论如何,您应该浏览很多示例。我只是希望能让你开始走上这条路…… 附言这种模式在 WPF 出现之前就已经使用过,在 WinForms 中也很常见

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-28
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 2012-02-24
      相关资源
      最近更新 更多