1

オブジェクトの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. datatemplateをgraphstyles.xamlに保持し、Attached Behaviorを使用してLoadedイベントをフックし、イベントトリガーをviewmodelsコマンドに渡します。
  3. UIが応答できるイベントをViewModelに作成し、それにフックして、実行したようにビューコードビハインドで処理します。

オプション2は、ビューとVMの分離をある程度壊すので、気が狂っていないと言わなければなりませんが、それで作業は完了します。グラフをオブジェクトとして、添付された動作からビューモデルに渡す必要があることに注意してください。次に、チャートにキャストする前に、ビューに戻ります。

于 2012-12-30T17:20:56.207 に答える