正在逃离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列表?

正在逃离WPF DataContext

您必须使用具有显式方式的Binding来指定其源(通过ElementNameSourceRelativeSource)。在这种情况下,我们使用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开头的。