将UserControl中元素的ItemSource绑定到父ViewModel中的项

时间:2012-06-27 07:22:02

标签: wpf mvvm binding user-controls itemssource

很抱歉,我正在同时学习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类中,我有一个创建的资源,它是一个&#39;生成器&#39;提供将由图形的某些部分使用的东西的类。它看起来像这样......

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

现在我现在正在使用嵌套用户控件的是,当我创建&#39;生成器&#39;在资源类中,我无法传递 ItemsSource =&#34; {Binding Source = {StaticResource myViewModel},Path = SampleData}&#34; 的绑定,因为我没有更长的时间可以访问父窗口的静态资源中的视图模型(myViewModel)!所以我不能像以前那样在资源创建期间设置绑定。

处理此类模式的正确MVVM方法是什么?

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

2 个答案:

答案 0 :(得分:2)

  1. DataContext是一个可继承的DependencyProperty,这意味着它会逐渐降低视觉层次结构。
  2. 资源在托管之前不属于可视树。
  3. 因此,在您的情况下,您的Graphs:LineChartGenerator必须托管在您的UserControl中,而不是在资源部分中进行详细说明。完成后,它会从父DataContext获取自己的Window,就像@GazTheDestroyer一样,指出您只需要隐式绑定ItemsSource="{Binding SampleData}"

答案 1 :(得分:1)

由于您将ViewModel设置为外部DataContext的{​​{1}},因此它也是Window的{​​{1}},因此您应该能够用简单的方式访问它:

DataContext