【问题标题】:Binding Command inside DataGridTemplateColumnDataGridTemplateColumn 内的绑定命令
【发布时间】:2011-11-27 04:33:55
【问题描述】:

我已通过命令将 View(包括 XAML)附加到我的 ViewModel。单击 DataGrid 行上的按钮时,我需要调用命令。我正在为此使用行为(常规命令有同样的问题)。当我单击 DataGrid 上的按钮时 - 我的命令不会被触发。

为了说明问题 - 我将 ListBox 放在底部,并带有完全相同的绑定内容 - 是的,命令有效。因此,它与 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>

【问题讨论】:

  • 为什么要使用 EventTrigger 而不是使用按钮的 Command 属性?
  • @Jehof 使用命令会出现同样的问题。我正在使用事件触发器来确保整个应用程序的一致性
  • 嗨@katit,你忘了给我奖励积分吗? ;)
  • @Xin 不,我没有,它需要等待 12 小时 :)
  • 呵呵谢谢@katit 我不知道! :)

标签: silverlight binding mvvm datagrid


【解决方案1】:

我很确定在DataGrid 中,您仍然需要DataContextProxy 才能使绑定工作。 ElementName 绑定不起作用(是的,它适用于 ListBox 模板,但不适用于 DataGrid,这是因为 DataGridTemplateColumn 不在可视树中),即使在 Silverlight 4 中也是如此。

更新

在 Silverlight 5 中,DataGrid 中不需要 DataContextProxy,这要归功于祖先绑定的支持。

示例

<Button Command="{Binding DataContext.CancelCommand, RelativeSource={RelativeSource AncestorType=sdk:DataGrid}}" />

【讨论】:

  • 默认的RelativeSourceMode值是平台特定的,所以你也应该设置它,比如
【解决方案2】:

我认为问题出在这一行

<i:InvokeCommandAction Command="{Binding ElementName=Control, Path=DataContext.ItemSelectedCommand}" CommandParameter="{Binding}" />

因为您的 XAML 中没有使用名称 Control(又名 x:Name="Control")定义的元素。

如果命令是在绑定到 LayoutRoot 的 DataContext 上定义的,则应将 ElementName=Control 更改为 ElementName=LayoutRoot

我不知道为什么这在 ListBox 中有效。

【讨论】:

  • 我的用户控件上有 x:Name = Control。它适用于列表框
猜你喜欢
  • 2011-09-28
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 2017-01-16
  • 1970-01-01
  • 2011-04-06
相关资源
最近更新 更多