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
绑定获取资源。