在DataGridTemplateColumn内绑定命令 [英] Binding Command inside DataGridTemplateColumn
问题描述
为了说明问题 - 我将ListBox放在底部,与EXACT相同的绑定东西 - 是的,命令工作。所以,它是与DataGrid / DataGridTemplateColumn
< Grid x:Name =LayoutRoot背景=白DataContext = {Binding}>
< Grid.RowDefinitions>
< RowDefinition Height =30/>
< RowDefinition Height =*/>
< RowDefinition Height =*/>
< /Grid.RowDefinitions>
< StackPanel Orientation =Horizontal>
< Button Content =取消>
< i:Interaction.Triggers>
< i:EventTrigger EventName =点击>
< ei:CallMethodAction MethodName =取消TargetObject ={Binding}/>
< / i:EventTrigger>
< / i:Interaction.Triggers>
< / Button>
< / StackPanel>
< sdk:DataGrid AutoGenerateColumns =FalseIsReadOnly =TrueItemsSource ={Binding Data}Grid.Row =1>
< sdk:DataGrid.Columns>
< sdk:DataGridTemplateColumn CanUserReorder =TrueCanUserResize =TrueCanUserSort =TrueWidth =Auto>
< sdk:DataGridTemplateColumn.CellTemplate>
< DataTemplate>
< Button Content =选择>
< i:Interaction.Triggers>
< i:EventTrigger EventName =点击>
< i:InvokeCommandAction Command ={Binding ElementName = Control,Path = DataContext.ItemSelectedCommand}CommandParameter ={Binding}/>
< / i:EventTrigger>
< / i:Interaction.Triggers>
< / Button>
< / DataTemplate>
< / sdk:DataGridTemplateColumn.CellTemplate>
< / sdk:DataGridTemplateColumn>
< sdk:DataGridTextColumn Binding ={Binding DeviceId}CanUserReorder =TrueCanUserResize =TrueCanUserSort =TrueHeader =DeviceWidth =AutoFontWeight =Bold/>
< sdk:DataGridTextColumn Binding ={Binding SerialNumber}CanUserReorder =TrueCanUserResize =TrueCanUserSort =TrueHeader =Serial NumberWidth =Auto/>
< sdk:DataGridTextColumn Binding ={Binding LastActivityOn}CanUserReorder =TrueCanUserResize =TrueCanUserSort =TrueHeader =Last ActivityWidth =Auto/>
< sdk:DataGridTextColumn Binding ={Binding ClientVersion}CanUserReorder =TrueCanUserResize =TrueCanUserSort =TrueHeader =Client VersionWidth =Auto/>
< sdk:DataGridTextColumn Binding ={Binding OSVersion}CanUserReorder =TrueCanUserResize =TrueCanUserSort =TrueHeader =OS VersionWidth =Auto/>
< / sdk:DataGrid.Columns>
< / sdk:DataGrid>
< ListBox Grid.Row =2ItemsSource ={Binding Data}>
< ListBox.ItemTemplate>
< DataTemplate>
< StackPanel Orientation =Horizontal>
< TextBlock Text ={Binding DeviceId}>< / TextBlock>
< Button Content =选择>
< i:Interaction.Triggers>
< i:EventTrigger EventName =点击>
< i:InvokeCommandAction Command ={Binding ElementName = Control,Path = DataContext.ItemSelectedCommand}CommandParameter ={Binding}/>
< / i:EventTrigger>
< / i:Interaction.Triggers>
< / Button>
< / StackPanel>
< / DataTemplate>
< /ListBox.ItemTemplate>
< / ListBox>
< / Grid>
我确实在一个 DataGrid
,您仍然需要 DataContextProxy 使绑定工作。 ElementName绑定不起作用(是的,它适用于 ListBox
模板,但不是 DataGrid
,这是因为DataGridTemplateColumn不在视觉树中),即使在Silverlight 4中。
更新
在Silverlight 5中,由于Ancestor绑定的支持, DataGrid
中不需要 DataContextProxy
。 >
示例
< Button Command = {Binding DataContext.CancelCommand,RelativeSource = {RelativeSource AncestorType = sdk:DataGrid}}/>
I have View(XAML included) attached to my ViewModel with commands. I need to invoke command when Button on DataGrid's row clicked. I'm using behaviors for this (regular commanding have same issue). When I click button on DataGrid - my command does not get fired.
To illustrate issue - I placed ListBox on a bottom with EXACT same binding stuff - and yes, command works. So, it's something with DataGrid/DataGridTemplateColumn
<Grid x:Name="LayoutRoot" Background="White" DataContext="{Binding}">
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal">
<Button Content="Cancel" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:CallMethodAction MethodName="Cancel" TargetObject="{Binding}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
</StackPanel>
<sdk:DataGrid AutoGenerateColumns="False" IsReadOnly="True" ItemsSource="{Binding Data}" Grid.Row="1">
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn CanUserReorder="True" CanUserResize="True" CanUserSort="True" Width="Auto">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="Select">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding ElementName=Control, Path=DataContext.ItemSelectedCommand}" CommandParameter="{Binding}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTextColumn Binding="{Binding DeviceId}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Device" Width="Auto" FontWeight="Bold" />
<sdk:DataGridTextColumn Binding="{Binding SerialNumber}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Serial Number" Width="Auto" />
<sdk:DataGridTextColumn Binding="{Binding LastActivityOn}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Last Activity" Width="Auto" />
<sdk:DataGridTextColumn Binding="{Binding ClientVersion}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Client Version" Width="Auto" />
<sdk:DataGridTextColumn Binding="{Binding OSVersion}" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="OS Version" Width="Auto" />
</sdk:DataGrid.Columns>
</sdk:DataGrid>
<ListBox Grid.Row="2" ItemsSource="{Binding Data}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding DeviceId}"></TextBlock>
<Button Content="Select">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding ElementName=Control, Path=DataContext.ItemSelectedCommand}" CommandParameter="{Binding}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
I am pretty sure inside a DataGrid
, you still need the DataContextProxy to make bindings working. The ElementName binding doesn't work (yes, it is working for ListBox
templates, but not DataGrid
, this is because DataGridTemplateColumn is not in the visual tree), even in Silverlight 4.
UPDATE
In Silverlight 5, DataContextProxy
is not needed in a DataGrid
thanks to the support of Ancestor binding.
Example
<Button Command="{Binding DataContext.CancelCommand, RelativeSource={RelativeSource AncestorType=sdk:DataGrid}}" />
这篇关于在DataGridTemplateColumn内绑定命令的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!