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

时间:2014-12-16 16:25:18

标签: c# silverlight datagrid telerik

我正在使用Telerik,但我想我的问题也会出现在常规DataGrid上。下面的代码显示了GridViewDataColumn的DataTemplate,它是我的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类的一部分。编译器抱怨说她找不到它。

1 个答案:

答案 0 :(得分:0)

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

有几种选择 - 一种是使用&#34; FindAncestor&#34;绑定以引用控件根,以及Blend SDK&#34; EventTrigger&#34; /&#34; CallMethodAction&#34;。所以如果您的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在内部为您处理了处理程序,并在单击时调用您的命令。