2012-12-30 38 views
1

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

我试着在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; 
     } 
    } 

回答

0

选项1

据我所知,你必须引用的DataTemplate中顶部的page/usercontrol的资源。使用合并的字典,以便仍然可以使用graphstyles.xaml。

如果你感到不舒服,因为这伤了你的惯例,有一个相当长的嗦替代:

选项2

  1. 使用的MVVM视图模型,并设置页面/用户控件的DataContext。
  2. 将数据模板保存在graphstyles.xaml中,并使用Attached Behavior钩住Loaded事件,并将事件触发器传递给viewmodels命令。
  3. 在ViewModel中创建一个UI可以响应的事件,然后钩住它并在视图代码隐藏中进行处理。

我必须说我对选项2没有生气,因为它有点破坏某些视图/虚拟机的分离,但它应该完成工作 - 请注意,您必须将图表作为对象通过附加行为,然后返回视图模型,然后再将其转换回图表。

+0

我去了选项#2。它确实打破了分离,但我希望这是一个临时解决方案。我正在使用这种技术来解决WinTxamltoolkit的饼图实现中的一个错误。 –

相关问题