【问题标题】:Dillema with newing an item in WPF MVVM在 WPF MVVM 中新建项目的困境
【发布时间】:2011-04-25 19:05:31
【问题描述】:

我已经构建了一个表单来显示包含在可观察集合中的项目的属性。这个可观察的集合位于 View 的数据上下文绑定到的 ViewModel 中。

当点击表单上的 New 按钮时,一个新的 Item 被添加到 observable 集合中,并且在 collectionview 的帮助下被设置为当前项目。使用相同的表格。这一次,因为是新项目,所以字段是空的。

现在,我希望 observable 集合中只有一个新项目。因此,我需要以某种方式区分项目和新项目。

因此,在新要求之前,我的 ViewModel 中有以下可观察集合:

public ObservableCollection<ItemViewModel> ItemTypes { get; private set; }

但现在我需要能够区分新项目和旧项目。我一直在尝试做一些事情,比如构建一个基类,我从中派生 Item 和 New Item,但这似乎真的很浪费,因为我想不出任何东西可以放入派生类中,它们真的只是那里可以帮助查看 observable 中是否有一个 Empty Item。

我能做什么?

编辑

private void CreateNewItemType()
{
   if (DoesNewItemTypeAlreadyExist())
   {
      return;
   }

   Model.ItemType itemType = new Model.ItemType();

   ItemTypeViewModel itemTypeViewModel = new ItemTypeViewModel(itemType)
   {
     IsNew = true
   };

   ItemTypes.Add(itemTypeViewModel);
   itemTypesCollectionView.MoveCurrentTo(itemTypeViewModel);
}

private bool DoesNewItemTypeAlreadyExist()
{
    return ItemTypes.Any(a => a.IsNew == true);
}

【问题讨论】:

  • bool IsNew 在模型上然后以不同方式绑定?
  • 是的,我也想到了这个想法。 - 但是你对 bind 不同是什么意思?基本上,我的代码只是通过 observable 集合来查看是否有空类型。根据您的建议,我已经放弃了所有内容以获得 IsNew 变量,但仍计划通过可观察集合进行搜索以找到真正的...

标签: wpf mvvm


【解决方案1】:

在您的项目上创建一个布尔属性(例如 IsDirty)。新建时,IsDirty 为 False。第一次更改某些内容时,请将其设置为 true。然后,您可以检查创建新项目的添加按钮的命令属性,以检查集合中是否有任何 IsDirty = False 项目。如果是这样,则将该项目设置为选中。如果没有,则添加一个新项目并选择它。

过去我所做的更改检测是创建一个字符串字典,字符串。字典包含属性的名称和原始值。在模型类中属性的更改事件处理程序中,我添加了一个添加或删除调用,以检查该属性的项是否存在,如果存在,则检查当前值和更改值。酌情致电OnPropertyChanged("IsDirty")

是否脏检查字典中是否有任何项目。美妙之处在于,如果您将值更改回其原始值,记录将恢复其 IsDirty=False 状态。

实施示例

Private Sub OnAddress1Changing(ByVal value As String)
    If Not m_dirtyFields.ContainsKey("Address1") Then
        AddDirtyField("Address1", Address1)
    Else
        If m_dirtyFields("Address1") = value Then RemoveDirtyField("Address1")
    End If
End Sub

    Public m_dirtyFields As New Dictionary(Of String, String)

    Private Sub AddDirtyField(ByVal ColName As String, ByVal OrigValue As String)
        If Not m_dirtyFields.ContainsKey(ColName) Then
            m_dirtyFields.Add(ColName, OrigValue)
            OnPropertyChanged("IsDirty")
        End If
    End Sub

    Private Sub RemoveDirtyField(ByVal ColName As String)
        If m_dirtyFields.ContainsKey(ColName) Then
            m_dirtyFields.Remove(ColName)
        End If
        OnPropertyChanged("IsDirty")
    End Sub

 Public ReadOnly Property IsDirty() As Boolean
        Get
            If m_dirtyFields.Count > 0 Then 'There are items so record is dirty
                Return True
            Else
                Return False
            End If
        End Get
    End Property

【讨论】:

  • 这真是太好了。我想我在那里做了很多思考,所有派生的空项目等等。在您回答之前,我有一条评论建议与您的思路相同:简单地使用一个布尔值来建议某个视图模型是否是新的。根据他的评论,我已经在研究我的代码来实现它并看看它是如何工作的。对于第 1 步。我将添加 bool 属性,在使用数据库中的项目填充它们时将其保留为默认值。添加新项目时,我会将 bool 设置为 true - 或者反过来,就像你建议的 IsDirty ;-)
  • 听起来像是一个半计划。如果还有其他事情,请告诉我。
  • 我计划编辑我的帖子并发布现在的一小段代码。然后我会查看并修改更多代码以实现您发布的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
  • 2018-02-02
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多