在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>
那也行不通。我需要改变数据上下文吗?我觉得必须有办法做到这一点。非常感谢任何想法。
答案 0 :(得分:4)
进入DataTemplate
后,DataContext
会切换到绑定项目。没有绕过它。
然而,您可以执行其他绑定。例如,如果您需要主数据上下文之外的内容,则可以执行以下操作:
"{Binding ElementName=Root, Path=DataContext.MyProperty}"
请注意,您的窗口或根元素需要x:Name="Root"
才能生效。您还可以通过StaticResource
绑定获取资源。