我正在开发一个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>
有人可以告诉我最好的方法是什么吗?
提前致谢, 詹卢卡。
答案 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的作用。
在此发布,因为我希望这些信息对其他人有用。
干杯,
詹卢卡