首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何根据属性隐藏wpf数据网格列

如何根据属性隐藏wpf数据网格列
EN

Stack Overflow用户
提问于 2011-07-28 18:52:35
回答 5查看 32.6K关注 0票数 24

我有以下WPF示例程序:

Xaml:

代码语言:javascript
复制
<Window x:Class="AncestorArie.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="BoolToVis" />
    </Window.Resources>
    <Grid>
        <DataGrid AutoGenerateColumns="False" Name="Blumen" 
                  ItemsSource="{Binding Leaves}">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Color}" 
                                    Header="Farbe" Width="160" />
                <DataGridTextColumn Binding="{Binding Size}" 
                                    Header="Größe" Width="60"
                                    Visibility="{Binding Path=DataContext.Flag, 
                                                RelativeSource={RelativeSource Findancestor, 
                                                AncestorType={x:Type Window}}, 
                                                Converter={StaticResource BoolToVis}}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

代码隐藏:

代码语言:javascript
复制
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Flowers rose = new Flowers();
        rose.Leaves = new ObservableCollection<Leaf>();

        rose.Flag = false;

        Leaf L1 = new Leaf();
        L1.Color = "rot";
        L1.Size = 3;
        rose.Leaves.Add(L1);

        Leaf L2 = new Leaf();
        L2.Color = "gelb";
        L2.Size = 2;
        rose.Leaves.Add(L2);

        this.DataContext = rose;            
    }
}

模型类包括:

代码语言:javascript
复制
public class Leaf
{
    public string Color { get; set; }
    public int Size { get; set; }
}

public class Flowers
{
    public bool Flag { get; set; }
    public ObservableCollection<Leaf> Leaves { get; set; }
}

如您所见,如果Flag属性设置为false,我希望隐藏第二个datagrid列。但它不起作用。我在Visual Studio输出窗口中看到以下绑定错误:

System.Windows.Data错误:4:无法找到具有引用'RelativeSource FindAncestor,AncestorType='System.Windows.Window',AncestorLevel=‘1’的绑定源。可见性;可见性;目标元素为'DataGridTextColumn‘(HashCode=44856655);目标属性为'Visibility’(类型为'Visibility')

我的代码中关于Visibility属性的错误是什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-07-28 20:24:05

数据网格中的列是一个抽象对象,它不会出现在可视化树中,因此您不能使用RelativeSource-binding,ElementName也不会工作,因为它找不到管理FrameworkContentElement,所以您处于某种绑定中。

一种工作方式是通过Sourcex:Reference,因此您需要命名窗口并将列移动到其资源,以避免循环依赖错误:

代码语言:javascript
复制
<Window Name="_window" ...>
    <Window.Resources>
        <DataGridTextColumn x:Key="ThatPeskyColumn"
                            Binding="{Binding Size}"
                            Visibility="{Binding DataContext.Flag, Source={x:Reference _window}, Converter={StaticResource BoolToVis}}"/>
    </Window.Resources>
    <!-- ... -->
        <DataGrid AutoGenerateColumns="False" Name="Blumen" 
                  ItemsSource="{Binding Leaves}">
            <DataGrid.Columns>
                <StaticResource ResourceKey="ThatPeskyColumn"/>
                <!-- ... -->

非常有趣。

票数 57
EN

Stack Overflow用户

发布于 2016-11-07 13:39:42

我更喜欢一种更优雅的方法,包括使用Freezable

代码语言:javascript
复制
<Window.Resources>

    <DiscreteObjectKeyFrame x:Key="FlagKey" Value="{Binding Flag}"/>

</Window.Resources>


<DataGridTextColumn ... Visibility="{Binding Value, Source={StaticResource FlagKey}, ...}" />
票数 12
EN

Stack Overflow用户

发布于 2011-07-28 19:24:41

DataGridTextColumn上的可见性不是DependencyProperty,不能绑定到数据。使用DataGridTemplateColumn并绑定模板内控件的可见性。

编辑:实际上,这句话只适用于silverlight。有关详细信息,请参阅另一个SO问题。

How to bind DataGridColumn.Visibility?

我在这里询问了判断属性是否是依赖项的最简单方法。

How can I most easily determine whether a property is a dependency property?

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6857780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档