gpt4 book ai didi

wpf - 将 UserControl 中元素的 ItemSource 绑定(bind)到父 ViewModel 中的项目

转载 作者:行者123 更新时间:2023-12-03 10:24:05 27 4
gpt4 key购买 nike

抱歉,我正在纠结于同时学习 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>

然后当我想做一些事情时,比如绘制图形线,我曾经通过绑定(bind)来引用生成器。
    <!-- Connect the points -->
<Polyline Points="{Binding Source={StaticResource generator}, Path=Points}" Stroke="Blue" />

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

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

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

最佳答案

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

  • 所以在你的情况下,你的 Graphs:LineChartGenerator必须托管在您的 UserControl 中并且没有在“资源”部分中提及。一旦你这样做,它就会获得自己的 DataContext来自家长 Window ,就像@GazTheDestroyer,指出你只需要一个隐式绑定(bind) ItemsSource="{Binding SampleData}"

    关于wpf - 将 UserControl 中元素的 ItemSource 绑定(bind)到父 ViewModel 中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11221239/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com