如何参照单元格的内容处理数据网格的列模板中的事件
本文关键字:网格 数据网 事件 数据 单元格 何参照 处理 | 更新日期: 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
在内部为您连接处理程序,并在单击命令时调用您的命令。