正在逃离WPF DataContext
本文关键字:DataContext WPF 逃离 | 更新日期: 2023-09-27 18:28:39
我对MVVM特别陌生。
我有以下XAML代码:
<ListBox x:Name="lsbTriggers" ItemsSource="{Binding SelectedProductPart.TriggerViewModels}">
<ListBox.ItemTemplate>
<HierarchicalDataTemplate >
<ComboBox SelectedItem="{Binding WatchedVariable}"
ItemsSource="{Binding SelectedProductPart.AllVariables}" >
</ComboBox>
</HierarchicalDataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我正在尝试制作一个列表,其中包含每个TriggerViewModel的组合框。
组合框的选定项由TriggerViewModel的WatchedVariable属性确定。
但是,我希望组合框的ItemsSource是SelectedProductPart对象提供的变量列表。我似乎无法做到这一点,因为数据上下文已经"放大"了,如果你愿意的话,在TriggerViewModels上,因为它是列表的ItemsSource。
我曾尝试在组合框内创建一个新的DataContext,但这似乎创建了两个断开连接的DataContexts,其中更改组合框的值不会导致TriggerViewModel的WatchedVariable的更改。
有没有一种方法可以逃离当前的DataContext,这样我就可以进入SelectedProductPart的AllVariables列表?
您必须使用具有显式方式的Binding
来指定其源(通过ElementName
、Source
或RelativeSource
)。在这种情况下,我们使用RelativeSource
。它有助于沿着视觉树向上走,并根据其类型(AncestorType
)瞄准源:
<ListBox x:Name="lsbTriggers" ItemsSource="{Binding SelectedProductPart.TriggerViewModels}">
<ListBox.ItemTemplate>
<HierarchicalDataTemplate >
<ComboBox SelectedItem="{Binding WatchedVariable}"
ItemsSource="{Binding DataContext.SelectedProductPart.AllVariables,
RelativeSource={RelativeSource AncestorType=ListBox}}" >
</ComboBox>
</HierarchicalDataTemplate>
</ListBox.ItemTemplate>
</ListBox>
请注意,Path
是以DataContext
开头的。