5

我正在开发一个广泛使用 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>

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

在此先感谢,吉安卢卡。

4

4 回答 4

12

您当前的绑定指向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>
于 2011-07-05T13:47:35.947 回答
2

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

在这种情况下,您应该使用替代来源。Command 应绑定到 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>

于 2011-07-05T13:34:18.667 回答
1

在 Silverlight 5 中,您可以执行此操作

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

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

于 2012-10-09T20:13:44.350 回答
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 所做的。

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

干杯,

詹卢卡

于 2011-07-21T15:45:49.907 回答