【问题标题】:Command binding inside a DataGridTemplateColumnDataGridTemplateColumn 内的命令绑定
【发布时间】:2011-09-28 19:33:16
【问题描述】:

我正在开发一个广泛使用 Prism、MVVM 模式和 MEF 的 Silverlight 应用程序。出于几个原因,我选择遵循视图优先的方法。

在其中一个视图中有一个 DataGrid,该网格的其中一列是 DataGridTemplateColumn,它只有一个 Button。

我想在按钮上同时定义命令和命令参数。 Command 应该是 ViewModel 的 DelegateCommand。 CommandParameter 应该是直接来自 dataGrid 的 SelectedItems 列表。

我已经尝试了几种方法来做到这一点,但 Command 或 CommandParameter 都为空。

它遵循我最初编写的代码:

<sdk:DataGridTemplateColumn>
    <sdk:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button Width="15" Height="15" Content=">" 
                    Command="{Binding UpdateSearchParametersCommand}" 
                    CommandParameter="{Binding SelectedItems, ElementName=dataGrid}">
        </DataTemplate>
    </sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>

有人可以建议我最好的方法是什么吗?

提前致谢, 詹卢卡。

【问题讨论】:

    标签: c# silverlight mvvm binding datagridtemplatecolumn


    【解决方案1】:

    如果您使用 ItemsSource 绑定 DataGrid,则 Command 和 CommandParameter 绑定将与当前项相关联 - 您编写的方式。

    在这种情况下,您应该使用替代来源。命令应绑定到 DataContext.UpdateSearchParametersCommand 和 CommandParameter - 到 DataContext.SelectedItems。

    在您的情况下,在绑定项目中找不到 UpdateSearchParametersCommand 和 SelectedItems。

    更新

    确保为祖先设置正确的类型。我已将其设置为窗口,但您可能正在使用 UserControl。

    <sdk:DataGridTemplateColumn>
    <sdk:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button Width="15" Height="15" Content=">" 
                    Command="{Binding Path=DataContext.UpdateSearchParametersCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" 
                    CommandParameter="{Binding Path=DataContext.SelectedItems, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}">
        </DataTemplate>
    </sdk:DataGridTemplateColumn.CellTemplate>
    

    【讨论】:

    • 通过包含按钮应具有的 xaml 来改进此答案。
    • @AnthonyWJones 没错。
    • @26071986:感谢您的回复。但是我注意到,在您的解决方案中,您寻找的是 Window 类型的祖先。我可能完全错了,但据我所知,Silverlight 不支持这一点。对吗?
    • @Gianluca Colucci 很有可能。作为 AncestorType,您应该放置 View 的类型,ViewModel 绑定到该类型。那么一切都会好起来的。
    • @26071986 RelativeSource 仅适用于 Silverlight 4 中的 SelfTemplatedParent。您需要改用 ElementName
    【解决方案2】:

    您当前的绑定指向DataGridRowItem.UpdateSearchParametersCommand。您需要将其更改为指向DataGrid.DataContext.UpdateSearchParametersCommand

    <sdk:DataGrid x:Name=dataGrid>
        <sdk:DataGridTemplateColumn>
            <sdk:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Width="15" Height="15" Content=">" 
                            Command="{Binding DataContext.UpdateSearchParametersCommand, ElementName=dataGrid}" 
                            CommandParameter="{Binding SelectedItems, ElementName=dataGrid}">
                </DataTemplate>
            </sdk:DataGridTemplateColumn.CellTemplate>
        </sdk:DataGridTemplateColumn>
    </sdk:DataGrid>
    

    【讨论】:

      【解决方案3】:

      你们中的许多人试图帮助我解决这个问题。谢谢你。 不幸的是,提供的答案大多与 WPF 相关。

      这是我解决问题的方法:

      <helpers:BindingHelper.Binding>
      <helpers:BindingList>
           <helpers:RelativeSourceBinding TargetProperty="Command" Path="DataContext.ToggleDataArchiveInheritanceCommand" RelativeMode="FindAncestor" AncestorType="ChildWindow" />
      </helpers:BindingList>
      </helpers:BindingHelper.Binding>
      

      好的,这来自同一个应用程序的另一个点,但原理是一样的。 如果在 a 中定义了绑定,则在 Silverlight 中访问通常超出范围的其他元素(因为它们不是 DataTemplate 的一部分)的唯一方法是遍历 xaml 对象树。这就是 BindingHelper 所做的。

      在这里发帖,希望这些信息对其他人有用。

      干杯,

      詹卢卡

      【讨论】:

      • Ciao Gianluca,感谢您发布此内容...我正在尝试做同样的事情,但不确定“BindingHelper”是什么。是否有更多的代码,或者是 Silverlight 中的 BindingHelper?
      • 嗨乔。你是对的,有更多的代码,虽然这很简单,但我之前已经在同一篇文章中用文字描述过。我需要查找我在 2011 年工作的源代码,以便复制和粘贴我当时创建的帮助程序类。现在欢呼。 g.
      【解决方案4】:

      在 Silverlight 5 中你可以做到这一点

      <Button Command="{Binding Path=DataContext.PreviewPublishCommand, RelativeSource={RelativeSource AncestorType=controls:ChildWindow}}" Content="Publish" />
      

      只需将 AncestorType 调整为您的顶级元素(UserControl、ChildWindow 等)。

      【讨论】:

        猜你喜欢
        • 2011-11-27
        • 2014-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-02
        • 2017-01-16
        • 1970-01-01
        • 2011-04-06
        相关资源
        最近更新 更多