1

我有一个 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;
        }
    } 
4

1 回答 1

0

选项1

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

如果您因为这违反了惯例而感到不舒服,那么有一个相当冗长的替代方案:

选项 2

  1. 使用 MVVM Viewmodel 并设置页面/用户控件 DataContext。
  2. 将数据模板保存在 graphstyles.xaml 中,并使用附加行为来挂钩 Loaded 事件,将事件触发器传递给 viewmodels 命令。
  3. 在 UI 可以响应的 ViewModel 中创建一个事件,然后像您所做的那样挂钩并在 Views 代码隐藏中处理。

我必须说我对选项 2 并不生气,因为它破坏了一些视图/VM 分离,但它应该可以完成工作 - 请注意,您必须将图表作为对象从附加的行为传递到视图模型然后回到视图,然后再将其转换回图表。

于 2012-12-30T17:20:56.207 回答