Dot-Net

綁定到數據網格中的命令

  • February 24, 2009

我在 WPF 應用程序中使用 MV-VM 模式。我將 ViewModel 綁定到 ContentControl 並使用視窗資源中定義的數據模板來呈現該 ViewModel 的視圖(UserControl)。

在 ViewModel 中,我有一個項目集合。我將該集合綁定到 WPF 工具包中提供的數據網格。同樣在視圖模型中,我定義了一個 RemoveItem 命令,該命令接受要刪除的項目 ID 的參數。

我將如何綁定到數據網格中的該命令?網格的數據上下文就是那個集合,所以類似於:

<Button Command="{Binding Path=RemoveCommand}" CommandParameter="{Binding Path=id}">X</Button>

不起作用 - 它找不到命令。我想我需要進行 RelativeSource 綁定,但那會是什麼樣子?祖先類型是 UserControl 還是 ContentControl?我的 ViewModel 作為 DataContext 駐留在哪裡?

還是我離這兒很遠?

是的,你只需要升一級。我會ElementName先嘗試綁定,RelativeSource只有在必要時才使用。例如,我更喜歡這個:

<DataGrid x:Name="_grid">
   ...
       <Button Command="{Binding DataContext.RemoveItem, ElementName=_grid}"/>
   ...
</DataGrid>

也就是說,當涉及到元素名稱和控制項範圍時,XAML 編譯器可能會陷入困境,因此您可能需要求助於RelativeSource

<DataGrid x:Name="_grid">
   ...
 <Button Command="{Binding DataContext.RemoveItem, 
                   RelativeSource={RelativeSource FindAncestor, 
                                   AncestorType={x:Type DataGrid}}
                  }"/>
   ...
</DataGrid>

您只需要搜尋直到數據上下文成為您的視圖模型。如果你願意,你可以搜尋UserControl- 不確定它是否真的很重要。兩者都是非常脆弱的綁定,這就是我更喜歡這種ElementName方法的原因。

引用自:https://stackoverflow.com/questions/581715