使用Model,View,ViewModel(MVVM)服务方式向DataGrid添加自定义类对象(DamagedItems)的列表。
我希望用户能够创建损坏部件的条目(在检查机器时认为不合适)。
我创建了:
DataContext
设置为DamagedItemViewModel
INotifyPropertyChanged
DamagedItemModel
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中,但文本框中的内容会保留在那里。
这一步很好,我写下我要添加的内容,然后点击“添加”
点击“添加”后,我在DataGrid中得到以下结果,这很好。问题是我的文本框仍然填充了数据,但模型已被清除(请参阅 DamagedItemViewModel AddEntry
方法后的代码。)
现在,当我尝试添加以下文字时:
我得到以下结果:
描述中输入的第一个字母在DataGrid的第一个条目中输入,然后删除描述文本框中的文本。只有这样我才能继续输入我想要的东西。 initiales文本框也会出现同样的情况。
有什么想法吗?如果你想看到我的更多代码,建议我应该添加哪个部分。
提前谢谢!
答案 0 :(得分:1)
看这里: 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支持的解耦。它易于实施。