在DataGridTemplateColumn内绑定命令 [英] Binding Command inside DataGridTemplateColumn

查看:158
本文介绍了在DataGridTemplateColumn内绑定命令的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有使用命令附加在ViewModel上的View(XAML)。当DataGrid的行上的按钮被点击时,我需要调用命令。我正在使用行为(正常命令有相同的问题)。当我点击DataGrid上的按钮 - 我的命令没有被触发。



为了说明问题 - 我将ListBox放在底部,与EXACT相同的绑定东西 - 是的,命令工作。所以,它是与DataGrid / DataGridTemplateColumn

 < Grid x:Name =LayoutRoot背景=白DataContext = {Binding}> 
< Grid.RowDefinitions>
< RowDefinition Height =30/>
< RowDefinition Height =*/>
< RowDefinition Height =*/>
< /Grid.RowDefinitions>
< StackPanel Orientation =Horizo​​ntal>
< 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 =Horizo​​ntal>
< 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆