WPF:在 ListView 的 ObservableCollection 外部绑定

WPF: Binding Outside the ListView's ObservableCollection

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

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

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

有一个 ComboBox(在 ListView 之外)可以更改某些列中显示的控件。我试图通过在可见性 属性:

上设置 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 移动到一个 class (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>

那也没用。关于数据上下文,我需要更改什么吗?我觉得必须有办法做到这一点。非常感谢任何想法。

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

但是,您还可以进行其他绑定。例如,如果你需要一些脱离主数据上下文的东西,你可以这样做:

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

请注意您的 window 或根元素需要 x:Name="Root" 才能正常工作。您还可以通过 StaticResource 绑定获取资源。