2009-02-24 60 views
17

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

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

我將如何綁定到數據網格中的該命令?網格的數據上下文就是這個集合,例如:

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

不起作用 - 它找不到命令。我想我需要做RelativeSource綁定,但是看起來會是什麼樣子? Ancestor類型是UserControl還是ContentControl?我的ViewModel作爲DataContext駐留在哪裏?

還是我在這裏?

回答

36

是的,你只需要升級一級。我會嘗試首先與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的方法。

+0

太棒了。謝謝,肯特! – 2009-02-24 13:52:02

1

我喜歡在名爲ViewModel的控件的datacontext中定義viewmodel。通過使用ElementName,綁定更易於書寫

... 
<UserControl.DataContext> 
    <local:UserControlViewModel x:Name="ViewModel"/> 
</UserControl.DataContext> 
... 

... 
<DataGridTemplateColumn Width="30"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Button Command="{Binding RemoveCommand, ElementName=ViewModel}" 
        CommandParameter="{Binding}">Remove</Button> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 
... 

請注意,在這種情況下,Command Parameter是該行的整個數據對象。有時比

CommandParameter="{Binding Id}" 

因爲您不必再​​次查找數據。