DataGridTemplateColumn中的命令绑定

时间:2011-07-05 13:07:04

标签: c# silverlight mvvm binding datagridtemplatecolumn

我正在开发一个Silverlight应用程序,它广泛使用Prism,MVVM模式和MEF。出于几个原因,我选择遵循View-first方法。

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

我想在Button上定义Command和CommandParameter。 Command应该是ViewModel的DelegateCommand。 CommandParameter应该是直接来自dataGrid的SelectedItems列表。

我已经尝试了几种方法来执行此操作,但Command或CommandParameter都为null。

它遵循我最初写的代码:

<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>

有人可以告诉我最好的方法是什么吗?

提前致谢, 詹卢卡。

4 个答案:

答案 0 :(得分:9)

您当前的绑定指向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>

答案 1 :(得分: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>

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

你们中的许多人试图帮助我解决这个问题。谢谢你。 不幸的是,提供的答案主要与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的作用。

在此发布,因为我希望这些信息对其他人有用。

干杯,

詹卢卡