c# - WPF:在 ListView 的 ObservableCollection 外部绑定(bind)

标签 c# wpf listview data-binding observablecollection

在 WPF 中,我有一个 ListView,其 ItemSource 绑定(bind)到 ObservableCollection:

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

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

有一个组合框(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 的绑定(bind)(例如在 CellTemplates 中填充 ComboBox)。但是,ListView 似乎没有从 ItemSource 之外的任何内容获取数据。

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

<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 会切换到绑定(bind)项。没有办法绕过它。

但是,您还可以执行其他绑定(bind)。例如,如果您需要主数据上下文之外的某些内容,您可以执行以下操作:

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

请注意,您的窗口或根元素需要 x:Name="Root" 才能正常工作。您仍然可以通过 StaticResource 绑定(bind)获取资源。

关于c# - WPF:在 ListView 的 ObservableCollection 外部绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28486426/

相关文章:

c# - 使用 C# 对空间中的 3D 点进行 K 均值聚类

c# - Treeview IsExpanded无法启动

wpf - 以编程方式选择并突出显示数据网格MVVM

WPF - 将图像水平绑定(bind)到 ListView

c# - 如何使用 C# 将 PDF 转换为 HTML

c# - IComparable.CompareTo 考虑继承的正确实现

android - Android 中具有动态选项卡内容的动态选项卡

android - 在 ListView 中隐藏页脚 View ?

c# - 建议使用 c# 和 css 为用户提供选择以将页面字体大小更改为任何可能数字的方法

c# - WPF 自定义 slider PART_SelectionRange 落后于拇指