将项添加到DataGrid(MVVM)

时间:2013-11-06 18:12:45

标签: wpf vb.net mvvm datagrid observablecollection

目标

使用Model,View,ViewModel(MVVM)服务方式向DataGrid添加自定义类对象(DamagedItems)的列表。

我希望用户能够创建损坏部件的条目(在检查机器时认为不合适)。

我做了什么

我创建了:

  • 一个窗口: wDamagedItems.xaml ,其中DataContext设置为DamagedItemViewModel
  • 一个模型: DamagedItemModel.vb ,它实现了INotifyPropertyChanged
  • ViewModel: DamagedItemViewModel.vb 我在其中设置了诸如DamagedItemModel
  • 等类的属性
  • 一个ObservableCollection: DamagedItemList.vb ,它继承了ObservableCollection(Of DamagedItemModel)

由于我的DataContext设置为 DamagedItemViewModel ,以下是我设置属性的方法:

Public Class DamagedItemViewModel
    Private _DamagedItem As DamagedItemModel
    Private _Add As ICommand
    Private _DamagedItems As DamagedItemList

    Public Property DamagedItem As DamagedItemModel
        Get
            Return _DamagedItem
        End Get
        Set(value As DamagedItemModel)
            _DamagedItem = value
        End Set
    End Property
    Public Property DamagedItems As DamagedItemList
        Get
            Return _DamagedItems
        End Get
        Set(value As DamagedItemList)
            _DamagedItems = value
        End Set
    End Property

    Public Property Add As ICommand
        Get
            Return _Add
        End Get
        Set(value As ICommand)
            _Add = value
        End Set
    End Property


    Public Sub New()
        DamagedItem = New DamagedItemModel("", "", "")
        DamagedItems = New DamagedItemList
        Add = New DamagedItemAddEntryCommand(Me)
    End Sub

    Public Function CanUpdate() As Boolean
        If DamagedItem.Description = "" Then Return False
        If DamagedItem.Initiales = "" Then Return False
        Return True
    End Function

    Public Sub AddEntry()
        DamagedItems.Add(DamagedItem) 'Items get added to the datagrid
        DamagedItem = New DamagedItemModel 'Does not seem to clear textboxes
    End Sub
End Class

以下是我的XAML设置方式:

<DataGrid ItemsSource="{Binding Path=DamagedItems}" AutoGenerateColumns="True" HorizontalAlignment="Stretch" Margin="12,90,12,0" Name="DataGrid1" VerticalAlignment="Top" Height="229" / >

<TextBox Text="{Binding DamagedItem.Description, UpdateSourceTrigger=PropertyChanged}"  Height="23" HorizontalAlignment="Left" Margin="88,24,0,0" VerticalAlignment="Top" Width="249" />
<TextBox Text="{Binding DamagedItem.Initiales, UpdateSourceTrigger=PropertyChanged}" Height="23" HorizontalAlignment="Left" Margin="88,58,0,0" VerticalAlignment="Top" Width="249" />

如您所见,我的文本框绑定到我的模型(它包含在我的ViewModel中,该模型绑定到该Window的DataContext)。每当我点击“添加”按钮时,文本框中的任何内容都会添加到DataGrid中,但文本框中的内容会保留在那里。


这一步很好,我写下我要添加的内容,然后点击“添加”

Damaged item about to be added

点击“添加”后,我在DataGrid中得到以下结果,这很好。问题是我的文本框仍然填充了数据,但模型已被清除(请参阅 DamagedItemViewModel AddEntry方法后的代码。)

Damaged item added, but still displaying

现在,当我尝试添加以下文字时:

  • 说明:“部分弯曲
  • Initiales:“ A.C

我得到以下结果:

描述中输入的第一个字母在DataGrid的第一个条目中输入,然后删除描述文本框中的文本。只有这样我才能继续输入我想要的东西。 initiales文本框也会出现同样的情况。

First letter being added in old class

有什么想法吗?如果你想看到我的更多代码,建议我应该添加哪个部分。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

是的,我记得遇到过这个。您必须实现iNotifyPropertyCHnaged。这是viewmodel类“通知”用户界面如何更改绑定的基础属性:

看这里: http://msdn.microsoft.com/en-us/library/ms743695.aspx

您必须为要反射回视图的每个属性实现此功能。所以我所做的是有一个基本的viewmodel类(ViewModelBase暴露方法RasiePropertyChanged),它实现了iNotifyPropertyChanged,然后我的viewmodles继承它。然后我通知属性属性集中更改的属性:

即:

    Public Property Selection As job
        Get
            Return Me._Selection
        End Get
        Set(ByVal value As job)
            If _Selection Is value Then
                Return
            End If
            _PreviousJob = _Selection
            _Selection = value
            RaisePropertyChanged(SelectionPropertyName)
        End Set
    End Property

这一开始看起来很令人沮丧,但需要保持MVVM支持的解耦。它易于实施。