1

申し訳ありませんが、MVVM、WPF、およびXAMLを同時に学習しているところです。

私が作成した問題があり、MVVMでこれをどのように処理するかについて完全に混乱しています。

私が持っているのは、グラフを描画するユーザーコントロールを含む親ウィンドウです。XAMLを描画するグラフは、以前は親ウィンドウの一部でしたが、親ウィンドウが非常に大きいため、組織用のユーザーコントロールに移動しました。

親ウィンドウのXAMLには....があります。

<Window ....>
     <Window.Resources>
         <ViewModel:DropGraphViewModel x:Key="myViewModel"/>
     </Window.Resources>

     <!-- Set the data context to the view model. -->
     <Window.DataContext>
         <Binding Source="{StaticResource myViewModel}"/>
     </Window.DataContext>
     .....
</Window>

次に、新しいユーザーコントロールXAMLクラスに、グラフの一部で使用されるものを提供する「ジェネレーター」クラスである作成されたリソースがあります。こんな感じ…

<UserControl ......
    <!-- Graph resources -->
        <Grid.Resources>
            <!-- The binding here for ItemsSource represents the collection the graph will be bound to -->

            <!-- THIS LINE DOESN'T WORK ANYMORE  -->
            <Graphs:LineChartGenerator x:Key="generator" ItemsSource="{Binding Source={StaticResource myViewModel}, Path=SampleData}" Width="500"  Height="200"> -->
        </Grid.Resources>

そして後で、グラフの線を描くなどのことをしたいときに、バインディングを介してジェネレーターを参照するために使用しました。

    <!-- Connect the points -->
    <Polyline Points="{Binding Source={StaticResource generator}, Path=Points}" Stroke="Blue" />

ネストされたユーザーコントロールを使用しているため、現在壊れているのは、リソースに「generator」クラスのインスタンスを作成するときに、ItemsSource ="{Binding Source={であったバインディングを渡すことができないことです。 StaticResource myViewModel}、Path = SampleData} "は、親ウィンドウの静的リソースにあるビューモデル(myViewModel)にアクセスできなくなったためです。そのため、以前のようにリソースの作成時にバインディングを設定することはできません。

このタイプのパターンを処理するための適切なMVVMの方法は何ですか?

ItemSourceを新しいユーザーコントロールに挿入して、LineChartGeneratorクラスインスタンスを作成するときに渡すことができるようにするにはどうすればよいですか?

4

2 に答える 2

2
  1. DataContextは継承可能DependencyPropertyです。つまり、視覚的な階層を少しずつ下に移動します。
  2. リソースは、ホストされるまでビジュアルツリーの一部ではありません。

したがって、あなたの場合、あなたGraphs:LineChartGeneratorはあなたの中でホストされなければUserControlならず、リソースセクションで削除されてはなりません。DataContextこれを行うと、親から独自の情報を取得しますWindow。この方法では、@ GazTheDestroyerとして、暗黙的なバインディングのみが必要であると指摘しました。ItemsSource="{Binding SampleData}"

于 2012-06-27T08:04:33.757 に答える
1

ViewModelをDataContext外側のに設定しているので、それはあなたWindowののにもなります。したがって、簡単な方法でアクセスできるはずです。DataContextUserControl

<Graphs:LineChartGenerator x:Key="generator" ItemsSource="{Binding SampleData}" Width="500"  Height="200">
于 2012-06-27T07:55:53.513 に答える