【问题标题】:Binding to a command in a datagrid绑定到数据网格中的命令
【发布时间】:2010-10-09 13:32:34
【问题描述】:

我在 WPF 应用程序中使用 M-V-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 驻留在哪里?

或者我离这里很远?

【问题讨论】:

    标签: .net wpf data-binding mvvm


    【解决方案1】:

    是的,您只需提升一级即可。我会先尝试与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 方法的原因。

    【讨论】:

    • 欢迎。另一种方法是公开一组子视图模型,而不是一组数据项。然后,这些子视图模型可以具有公开命令的属性,从而避免引入此类脆弱的绑定。
    • 甜,正是我需要的 +1
    • 完全满足我的需求。加一个!
    【解决方案2】:

    我喜欢在名为 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>
    ...
    

    请注意,在这种情况下,命令参数是行的整个数据对象。有时比

    CommandParameter="{Binding Id}"  
    

    因为您不必再​​次查找数据。

    【讨论】:

      猜你喜欢
      • 2012-01-29
      • 1970-01-01
      • 2020-08-02
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 2011-06-15
      相关资源
      最近更新 更多