DataTemplate的WinRT事件处理

时间:2012-12-30 01:01:11

标签: winrt-xaml

我有一个DataTemplate,它需要一个对象的事件处理程序。此DataTemplate包含在ResourceDictionary中。向此模板添加事件处理程序的最佳方法是什么?

我尝试在app.xaml.cs中定义事件处理程序,但处理程序没有执行。为ResourceDictionary创建代码隐藏文件会导致在MergedDictionaries中启动应用程序时加载错误。

来自GraphStyles.xaml的

<DataTemplate x:Key="PieTemplate">
    <Grid HorizontalAlignment="Left" Width="350" Height="350" >
        <Border>
            <Charting:Chart
            x:Name="PieChart"
            Title="Play Attempts"
            Margin="70,0" Loaded="PieChart_Loaded">
                <Charting:Chart.Series>
                    <Charting:PieSeries
                    Title="Attempts"
                    ItemsSource="{Binding Items}"
                    IndependentValueBinding="{Binding Name}"
                    DependentValueBinding="{Binding Value}"
                    IsSelectionEnabled="True" />
                </Charting:Chart.Series>
            </Charting:Chart>
        </Border>
    </Grid>
</DataTemplate>

在App.Xaml.cs

    private void PieChart_Loaded(object sender, RoutedEventArgs e)
    {
        var pieChart = sender as Chart;
        var legendItems = ((PieSeries)pieChart.Series[0]).LegendItems;

        foreach (LegendItem item in legendItems)
        {
            pieChart.LegendItems.Add(item);
            pieChart.LegendStyle = item.Style;
        }
    } 

1 个答案:

答案 0 :(得分:0)

选项1

据我所知,您必须在页面/ usercontrol的顶部参考资源中引用datatemplate。使用合并字典,您仍然可以使用graphstyles.xaml。

如果你感到不舒服,因为这违反了你的惯例,那么有一个相当漫长的选择:

选项2

  1. 使用MVVM Viewmodel并设置page / usercontrols DataContext。
  2. 将datatemplate保留在graphstyles.xaml中,并使用Attached Behavior挂钩Loaded事件,将事件触发器传递给viewmodels命令。
  3. 在ViewModel中创建一个UI可以响应的事件,然后像你一样挂钩到那个并在Views代码隐藏中处理。
  4. 我必须说我对选项2并不感到生气,因为它打破了一些视图/虚拟机分离,但它应该完成工作 - 请注意,您必须通过附加行为将图表作为对象传递,到视图模型然后在将其转换回图表之前返回到视图。