WPF:在ListView的ObservableCollection之外绑定

时间:2015-02-12 19:44:47

标签: c# wpf listview data-binding observablecollection

在WPF中,我有一个ListView,它的ItemSource绑定到ObservableCollection:

<ListView ItemsSource="{Binding Path=TestList, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">

TestList是TestCase类型的集合,它有几个成员。这适用于使用TestList成员中的信息填充ListView列,但我还需要访问集合外部的属性。

有一个ComboBox(在ListView之外)可以更改某些列中显示的控件。我尝试在Visibility属性上设置DataTrigger:

<GridViewColumn Header="Area" Width="100">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=Area}">
                <TextBlock.Style>
                    <Style TargetType="{x:Type TextBlock}">
                        <Style.Setters>
                            <Setter Property="Visibility" Value="Visible"/>
                        </Style.Setters>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=IdentitySelection}" Value="Test Management">
                                <Setter Property="Visibility" Value="Collapsed"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

我还有一些其他需要从TestList外部进行绑定的地方(例如在CellTemplates中填充ComboBox)。但是,ListView似乎没有从ItemSource之外的任何内容获取数据。

我尝试将TestList和IdentitySelection移动到一个类(TestManager)中,将其声明为一个大型属性并绑定到该类:

<ListView ItemsSource="{Binding Path=TestManager, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Area" Width="100">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=TestList.Area}">
                            <TextBlock.Style>
                                <Style TargetType="{x:Type TextBlock}">
                                    <Style.Setters>
                                        <Setter Property="Visibility" Value="Visible"/>
                                    </Style.Setters>
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding Path=IdentitySelection}" Value="Test Management">
                                            <Setter Property="Visibility" Value="Collapsed"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </TextBlock.Style>
                        </TextBlock>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

那也行不通。我需要改变数据上下文吗?我觉得必须有办法做到这一点。非常感谢任何想法。

1 个答案:

答案 0 :(得分:4)

进入DataTemplate后,DataContext会切换到绑定项目。没有绕过它。

然而,您可以执行其他绑定。例如,如果您需要主数据上下文之外的内容,则可以执行以下操作:

"{Binding ElementName=Root, Path=DataContext.MyProperty}"

请注意,您的窗口或根元素需要x:Name="Root"才能生效。您还可以通过StaticResource绑定获取资源。