【问题标题】:IEditableObject in MVVMMVVM 中的 IEditableObject
【发布时间】:2010-12-10 15:23:18
【问题描述】:

您能想到IEditableObject 在基于 MVVM 的 WPF 应用程序中仍然有用的场景吗?如果是这样,你有一个例子来证明这一点。

【问题讨论】:

    标签: wpf mvvm ieditableobject


    【解决方案1】:

    我在我的一个应用程序中使用了IEditableObject。例如,如果您有一个用于编辑内容的对话框,您可以在 ViewModel 上实现 IEditableObject。当对话框打开时您调用BeginEdit(),当用户单击确定时调用EndEdit(),当用户单击取消时调用CancelEdit()

    IEditableObject 是一个很好的界面,您可以随时回滚更改。

    【讨论】:

    • 您是在每个 ViewModel 类中实现方法还是在原始抽象类中实现方法?如果是原班,那你怎么办呢。我正在考虑再次从数据库中获取模型,但模型没有联合父类。我不确定反射方法,因为我只编辑模型部分。
    • 视情况而定。如果模型具有在这些事件上运行的通用功能,我只会在抽象基类中实现它。如果是这样,您可以在那里实现它,但在其中调用派生类需要提供的抽象方法,如 OnBeginEdit()。这样一来,您就可以涵盖通用功能和特定功能。
    • 我有一个 ViewModel,它是一个对象的集合。我想使用一个对话框来编辑选定的 gridview 项目。哪个实现了IEditableObject、包含网格的视图、网格绑定到的 ViewModel 或 ViewModel 包含的集合的类?
    • @MarkRichman 我会说 ViewModel 包含一个集合的类,因为它是唯一有意义的地方。 BeginEdit、EndEdit 和 CancelEdit 很好地映射到带有 OK 和 Cancel 按钮的模式对话框。
    【解决方案2】:

    我在我的应用程序中实现了IEditableObject,这样如果用户输入的内容无效,我可以避免更新我的数据模型,如果用户放弃更改,我可以回滚到原始值。

    【讨论】:

      【解决方案3】:

      DataGrid 中显示的类型内。这是需要的,因为当我使用选项卡并且DataGrid 存储在该选项卡中时,切换了强制提交所需的选项卡,因此如果单元格处于活动状态,可以在DataGrid 中发言;回滚更改,因为它们没有提交。 T

      DataGrid 应用了一种行为来实现此功能,但 IEditableObject 部分在下方。

      private IDatabaseConnection _copy;
      
      void IEditableObject.BeginEdit()
      {
          if (this._copy == null)
              this._copy = _container.Resolve<IDatabaseConnection>();
      
          _copy.Database = this.Database;
          _copy.DisplayName = this.DisplayName;
          _copy.HostName = this.HostName;
          _copy.Username = this.Username;
          _copy.Password = this.Password;
      }
      
      void IEditableObject.CancelEdit()
      {
          this.Database = _copy.Database;
          this.DisplayName = _copy.DisplayName;
          this.HostName = _copy.HostName;
          this.Username = _copy.Username;
          this.Password = _copy.Password;
      }
      
      void IEditableObject.EndEdit()
      {
          _copy.Database = String.Empty;
          _copy.DisplayName = String.Empty;
          _copy.HostName = String.Empty;
          _copy.Username = String.Empty;
          _copy.Password = String.Empty;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-27
        • 2011-05-25
        • 1970-01-01
        • 2017-06-16
        相关资源
        最近更新 更多