很抱歉,我正在同时学习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类实例时将其传入?
答案 0 :(得分:2)
DataContext
是一个可继承的DependencyProperty
,这意味着它会逐渐降低视觉层次结构。 因此,在您的情况下,您的Graphs:LineChartGenerator
必须托管在您的UserControl
中,而不是在资源部分中进行详细说明。完成后,它会从父DataContext
获取自己的Window
,就像@GazTheDestroyer一样,指出您只需要隐式绑定ItemsSource="{Binding SampleData}"
答案 1 :(得分:1)
由于您将ViewModel设置为外部DataContext
的{{1}},因此它也是Window
的{{1}},因此您应该能够用简单的方式访问它:
DataContext