WinRT事件处理从数据模板



我有一个DataTemplate,它需要一个对象的事件处理程序。这个数据模板包含在一个资源字典中。向此模板添加事件处理程序的最佳方式是什么?

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

从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

据我所知,您必须在页面/用户控件的资源中引用顶部的数据模板。使用合并的字典,这样您仍然可以使用graphstyles.xaml.

如果你不舒服,因为这打破了你的惯例,有一个相当冗长的替代:

选项2

  1. 使用MVVM视图模型并设置page/usercontrols DataContext。
  2. 将数据模板保留在图形样式中。并使用一个Attached Behavior来挂钩已加载的事件,将事件触发器传递给viewmodels命令。
  3. 在ViewModel中创建一个UI可以响应的事件,然后挂钩到该事件并在视图代码中处理,就像你所做的那样。

我必须说我不喜欢选项2,因为它打破了一些视图/虚拟机分离,但它应该完成工作-注意,你必须将图表作为对象通过附加行为传递到视图模型,然后在将其转换回图表之前返回到视图。

最新更新