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" />

现在我正在使用嵌套用户控件的问题是,当我在资源中创建“生成器”类的实例时,我无法传入ItemsSource="{Binding Source={ StaticResource myViewModel}, Path=SampleData}"因为我不再有权访问父窗口的静态资源中的视图模型(myViewModel)!所以我不能像以前那样在资源创建期间设置绑定。

处理这种模式的正确 MVVM 方法是什么?

如何将 ItemsSource 注入到我的新用户控件中,以便它可以在创建 LineChartGenerator 类实例时将其传入?

4

2 回答 2

2
  1. DataContext是可继承的DependencyProperty,这意味着它会向下渗透视觉层次结构。
  2. 资源在托管之前不是可视化树的一部分。

因此,在您的情况下,您Graphs:LineChartGenerator必须托管在您UserControl的资源部分中,而不是在资源部分中删除。一旦你这样做,它就会DataContext从 parent获取它自己的Window,就像@GazTheDestroyer,指出你只需要一个隐式绑定ItemsSource="{Binding SampleData}"

于 2012-06-27T08:04:33.757 回答
1

由于您将 ViewModel 设置DataContext为外部的Window,它也将DataContext是您的UserControl,因此您应该能够通过简单的方式访问它:

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