我真的不知道如何标题这个问题,但我需要一些帮助来绑定到ListBox。
我有一个对象,它包含(在其他信息中)需要绑定在一个ListBox中的2个属性。其中一个是ObservableCollection对象,称为Layers,另一个属性包含Point,Line或Polygon的枚举值,称为SpatialType。这些是充当地图应用程序的图例。我已将Layers绑定到ListBox,没问题,但在ListBox.ItemTemplate中,我需要将单个变量SpatialType绑定到ListBox中的每个Item。我遇到的问题是,当我尝试在ListBox内部绑定时,我可以访问的唯一变量是每个Layer的属性,我无法访问包含层的原始绑定类的任何属性(和所需的SpatialType属性)。
如何在不破坏好的MVVM架构的情况下将这条信息绑定到ItemTemplate中,我该怎么办?
答案 0 :(得分:0)
您可以在视图中有一个ObjectDataProvider,它是datacontext的基础,并且ObjectInstance指向您的viewmodel。然后您可以像这样从ItemTemplate绑定:
<UserControl.Resources>
<ObjectDataProvider x:Key="Data"/>
<DataTemplate x:Key="Template">
<TextBlock Text="{Binding SpatialType,Source={StaticResource Data}}/>
</DataTemplate>
</UserControl.Resources>
<Grid DataContext={Binding Source={StaticResource Data}}>
<ListBox ItemsSource="{Binding Layers}" ItemTemplate="{StaticResource Template}"/>
</Grid>
希望这有帮助。
答案 1 :(得分:0)
我最终做的是使用FindAncestor在绑定中获取更高“层”的DataContext:
Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, Path=DataContext.LayerSymbolization.SpatialType, Mode=TwoWay}"