2017-07-03 106 views
1

我試圖執行下面的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。

+0

如何設置'DataGrid'的'ItemsSource'?如果您使用例如一個'ObservableCollection'你可以從'''中刪除條目,你的視圖會自動更新。 –

+0

@MightyBadaboom ItemsSource確實是一個ObservableCollection,在做了一些調整之後,我可以通過從集合中刪除相應的項目來使它工作。但是如果我需要從一個沒有ItemsSource屬性的Grid中刪除一個UI元素,讓我們說一個StackPanel? –

+0

幹得好,所以你不需要任何幫助? –

回答

0

從綁定到網格的ItemsSource的ObservableCollection中刪除項目完美地工作,但是如果我需要從沒有ItemsSource的網格中移除像StackPanel這樣的UI元素,該怎麼辦?

由於該代碼是純粹視圖相關,它應該在視圖的代碼隱藏來實現(或在其施加控制本身)。視圖模型不應該知道關於任何UI元素的任何信息,因此實施刪除這些元素的命令是沒有意義的。

MVVM不是關於從視圖中刪除視圖-相關代碼。這是關於分離問題。因此,在您看來,請保留與UIElements和​​相關的所有內容。

+0

實際上,當我單擊StackPanel內的按鈕時,我需要從網格中移除StackPanel,並從ViewModel中的ObservableCollection中移除一個項目。 –

+0

然後,您應該使用您綁定到源集合的ItemsControl,然後將StackPanel添加到ItemTemplate。 – mm8

+0

我更新了我的問題。然後你建議使用ItemsControl而不是Grid?在這種情況下,爲了改變項目的順序,我應該添加一個自定義索引屬性到我的UserControl? –