在listbox itemssource中绑定到viewmodel

时间:2013-11-11 11:53:21

标签: wpf xaml mvvm binding scope

我有一个绑定到itemscollection的列表框。在列表框中,我希望能够访问我的viewmodel的属性。

VarA和VarB是itemscollectionB的属性,它们打印得很好 VarC是我的viewmodel中的一个属性,我希望与其他信息一起显示

我给出的消息是“无法在类型'Item'的数据上下文中解析属性VarC,我理解这是试图访问Item.VarC但我只想访问我在viewmodel中声明的公共属性VarC

基本上我需要横向打印三件事 itemscollectionB [i] .VarA itemscollectionB [i] .VarB,VarC

我该怎么做

<ListBox Background="white" x:Name="Name"  VerticalAlignment="Stretch" 
         BorderThickness="0" ItemsSource="{Binding Path=ItemsCollectionA}" 
         Margin="0" Width="Auto" HorizontalAlignment="Stretch" >
    <ListBox.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#F0F0F0"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#F0F0F0"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black"/>
    </ListBox.Resources>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel >
                <ListBox BorderThickness="0" Margin="0" 
                        ItemsSource="{Binding Path=ItemsCollectionB}" 
                        FontFamily="Arial Black" FontSize="9" 
                        FontWeight="Bold">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock FontFamily="Arial"  
                                    Text="{Binding Path=VarA}"/>
                                <TextBlock FontFamily="Arial"  
                                    Text="{Binding Path=VarB}" Margin="5,0" />
                                <TextBlock FontFamily="Arial"  
                                    Text="{Binding Path=VarC}" Margin="0,0" />
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

2 个答案:

答案 0 :(得分:4)

实现此目的的一般方法是使用适当的视图模型,其中包含相关视图所需的所有属性。现在,假设您已使用一种方法或另一种方法将视图的DataContext设置为相关视图模型的实例,则在同一视图模型中应该具有ItemsCollectionAVarC属性

如果是这样,那么我们只需使用RelativeSource Binding即可从ItemTemplate访问视图模型。假设您的视图名为YourView

{Binding DataContext.VarC, RelativeSource={RelativeSource 
    AncestorType={x:Type YourView}}}

观察这一点,我们可以看到RelativeSource Binding将查找类型为YourView的父类,然后它将在设置为的对象中查找名为VarC的属性它的DataContext

答案 1 :(得分:-1)

  <TextBlock FontFamily="Arial" Text="{Binding Path=DataContext.VarC,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Margin="0,0" />