【问题标题】:Binding ItemSource of an element in a UserControl to an item in the parents ViewModel将 UserControl 中元素的 ItemSource 绑定到父 ViewModel 中的项目
【发布时间】:2012-06-28 14:12:07
【问题描述】:

抱歉,我正在忙于同时学习 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 类实例时将其传入?

【问题讨论】:

    标签: wpf mvvm binding user-controls itemssource


    【解决方案1】:

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

    <Graphs:LineChartGenerator x:Key="generator" ItemsSource="{Binding SampleData}" Width="500"  Height="200">
    

    【讨论】:

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

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

      【讨论】:

      • 你说,@AngelWPF,它必须托管在我的 UserControl 中,但这是一个从 DependencyObject 派生的简单类。如果它不是视觉元素,我可以托管它吗?这是一个交还视觉元素的类....
      • 啊,我永远无法让我的资源绑定到数据上下文。我把它做成了一个 FrameworkElement 并直接放在网格中,现在它可以继承数据上下文了。我猜这就是你的意思。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 2019-11-27
      • 2018-10-29
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多