我試圖執行下面的MVVM模式的命令,但我堅持這種特殊的情況。正確的MVVM模式WPF命令執行
在XAML我已經綁定的命令按鈕一列中:
<dxg:GridColumn FieldName="Delete" Header="" UnboundType="Object" Width="20" FixedWidth="True">
<dxg:GridColumn.EditSettings>
<dxe:ButtonEditSettings AllowDefaultButton="False">
<dxe:ButtonEditSettings.Buttons>
<dxe:ButtonInfo GlyphKind="Cancel" Command="{Binding DeleteRowCommand}" CommandParameter="{Binding ElementName=testView}" />
</dxe:ButtonEditSettings.Buttons>
</dxe:ButtonEditSettings>
</dxg:GridColumn.EditSettings>
</dxg:GridColumn>
在我的ViewModel我宣佈DelegateCommand:
Private m_deleteRowCommand As DelegateCommand(Of Object)
Public Property DeleteRowCommand() As DelegateCommand(Of Object)
Get
Return m_deleteRowCommand
End Get
Private Set(ByVal value As DelegateCommand(Of Object))
m_deleteRowCommand = value
End Set
End Property
我初始化裏面的命令ViewModel的構造函數:
DeleteRowCommand = New DelegateCommand(Of Object)(AddressOf DeleteRowCommandExecute)
最後我執行命令:
Private Sub DeleteRowCommandExecute(ByVal parameter As Object)
Dim sender As TableView = parameter
Dim row = sender.DataControl.CurrentItem
Dim index = sender.FocusedRowHandle
sender.DeleteRow(index)
End Sub
一切都按預期工作,但據我所知,ViewModel應該對視圖一無所知,因此刪除ViewModel中的行是不正確的。
以下MVVM模式的最佳做法是什麼?
UPDATE: 刪除從綁定到網格的ItemsSource時的的ObservableCollection項目作品完美,但如果我需要從哪些不具有的ItemsSource網格刪除UI元素就像一個StackPanel什麼?
<Grid>
<StackPanel>
<Button Content="Delete" Height="25" Width="100" Command="{Binding DeleteItemCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=StackPanel}}" />
</StackPanel>
</Grid>
UPDATE2: 我的目標是有一個容器,我可以添加項目(用戶控件)動態和地方我能夠在運行時改變這個項目的順序。 目前,我使用網格作爲容器,每次添加新的RowDefinition時,都會插入一個新項目。 我使用Grid.Row屬性來跟蹤和更改項目的順序。 這樣我需要在後面的代碼中執行所有刪除操作,因爲我必須手動從網格中刪除RowDefinition。
如何設置'DataGrid'的'ItemsSource'?如果您使用例如一個'ObservableCollection'你可以從'''中刪除條目,你的視圖會自動更新。 –
@MightyBadaboom ItemsSource確實是一個ObservableCollection,在做了一些調整之後,我可以通過從集合中刪除相應的項目來使它工作。但是如果我需要從一個沒有ItemsSource屬性的Grid中刪除一個UI元素,讓我們說一個StackPanel? –
幹得好,所以你不需要任何幫助? –