如何参照单元格的内容处理数据网格的列模板中的事件

本文关键字:网格 数据网 事件 数据 单元格 何参照 处理 | 更新日期: 2023-09-27 18:34:20

我正在使用Telerik,但我想我的问题也会出现在常规DataGrid上。下面的代码显示了 GridViewDataColumn 的数据模板,它是我的 MainPage.xaml 的一部分。

<telerik:RadTreeListView x:Name ="MyGrid" ...>
    <telerik:RadTreeListView.Columns>
        <telerik:GridViewDataColumn>
            <telerik:GridViewDataColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel ...>
                        <TextBlock Text="{Binding Path=Name}" MouseLeftButtonDown="OnMouseLeftButtonDown"/>
                    </StackPanel>
                </DataTemplate>
            </telerik:GridViewDataColumn.CellTemplate>
        </telerik:GridViewDataColumn>
    </telerik:RadTreeListView.Columns>
</telerik:RadTreeListView>

在我设置的后面的代码中

MyGrid.ItemsSource = items; // items is an ObservableCollection<MyItem>

MyItem 是每个列单元格的视图模型。在那里,我定义了所有不同的属性,例如我绑定到的名称。这部分效果很好。完全不起作用的是调用方法 OnMouseLeftButtonDown,它是 MyItem 类的一部分。编译器抱怨她找不到它。

如何参照单元格的内容处理数据网格的列模板中的事件

代码隐藏事件处理程序无法从 DataTemplates 内部工作(不确定确切原因,但我想这与 XAML 元素的编译时与运行时解析有关)。

有几种替代方法 - 一种是使用"FindAncestor"绑定来引用控件根,以及Blend SDK"EventTrigger"/"CallMethodAction"。 因此,如果您的 XAML 如下所示:

<UserControl x:Name="userControl">
    ...
    <telerik:RadTreeListView ...>

然后,您可以附加如下所示的鼠标单击处理程序:

<telerik:GridViewDataColumn.CellTemplate>
    <DataTemplate>
        <StackPanel ...>
            <TextBlock Text="{Binding Path=Name}">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="MouseLeftButtonDown">
                        <ei:CallMethodAction TargetObject="{Binding RelativeSource={RelativeSource AncestorType=telerik:RadTreeListView},Path=DataContext}"
                                             MethodName="OnMouseLeftButtonDown" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </TextBlock> 
        </StackPanel>
    </DataTemplate>
</telerik:GridViewDataColumn.CellTemplate>
使用

Blend SDK 的替代方法是使用 Button 或其他支持 Command 的控件,而不是 TextBlock 。 这样,您只需将 Button 的命令绑定到视图模型中的属性:

Command={Binding RelativeSource={RelativeSource AncestorType=telerik:RadTreeListView},Path=DataContext.SomeCommand}

请注意,在这种情况下,您不必担心鼠标单击事件,因为Button在内部为您连接处理程序,并在单击命令时调用您的命令。