我正在使用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类的一部分。编译器抱怨说她找不到它。
答案 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
在内部为您处理了处理程序,并在单击时调用您的命令。