none
DataGridTextColumn.Visibility绑定问题 RRS feed

  • 问题

  • DataGridTextColumn的Visibility属性虽然是依赖属性,但是却无法绑定,在网上其它地方找到的方法似乎都无效,希望大虾们能提供一个可用的Visibility绑定方案,谢谢!
    2011年4月6日 8:24

答案

  • 呵呵,周末出去玩了,所以今天才回复。

    我看你上传sample了,首先确定的是,这个问题的原因不是DataGrid4和toolkit 的DataGrid的问题。

    我看到你的绑定是类似下面这样做的:

    <DataGridTextColumn Binding="{Binding ColumnB}" Header="ColumnB" Width="*" Visibility="{Binding Path=IsChecked, ElementName=ckb_B, Converter={StaticResource Bool2VisibilityConverter}}"/>

    由于DataGridTextColumn和你的CheckBox并不是在一个Visualtree上,所以你的DataGridTextColumn并不能找到这个“ElementName=ckb_B”,所以这个绑定是没有办法工作的,当运行程序的时候你会在OutPut窗口中看到绑定的异常信息。

    要想使得DataGridTextColumn和CheckBox有交集,你必须要使得他俩都绑定到另一个属性上,比如:

    <CheckBox Content="ColumnA" x:Name="ckb_A" IsChecked="{Binding ShowA}"/>

    <DataGridTextColumn Binding="{Binding ColumnC}" Header="ColumnC" Width="*" Visibility="{Binding (FrameworkElement.DataContext).ShowA, RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource Bool2VisibilityConverter}}"/>

    第二个问题就是:

    <Window.DataContext>

        <local:ViewModel/>

    </Window.DataContext>

    你如果按照这种方式去赋值DataContext,这样你的这个函数:

    public static void OnDataContextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

    {

        DataGrid grid = d as DataGrid;

        if (grid != null)

        {

            foreach (DataGridColumn col in grid.Columns)

            {

                col.SetValue(FrameworkElement.DataContextProperty, e.NewValue);

            }

        }

    }

    就会在你的DataGrid生成Column之前执行,所以你要在代码中赋值DataContext,比如:

    this.DataContext = new ViewModel();

    这样你的问题就解决了。

     

    Best regards,


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 懵盛盛 2011年4月11日 13:24
    2011年4月11日 5:18
    版主

全部回复

  • 不知道你有没有试过这个方法:

    http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

     


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年4月6日 15:35
    版主
  • 不知道你有没有试过这个方法:

    http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

     


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    这个链接上的内容似乎能帮助我,但是源码似乎已经失效了
    2011年4月7日 10:15
  • 源码失效?不会啊,给你连接的时候我已经测试过了啊,是可以运行的~ 我是为了节省时间 就没有自己去写一个sample,这样,我先将他的source上传一下,你看看这个版本的好用么?

    下载地址:

    http://cid-41e44c402aaada87.office.live.com/self.aspx/datagridworkaround/datagridworkaround.zip

    (他的代码肯定是好用的,我测试过)

    如果不行,告诉我。

     


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年4月7日 10:37
    版主
  • 源码失效?不会啊,给你连接的时候我已经测试过了啊,是可以运行的~ 我是为了节省时间 就没有自己去写一个sample,这样,我先将他的source上传一下,你看看这个版本的好用么?

    下载地址:

    http://cid-41e44c402aaada87.office.live.com/self.aspx/datagridworkaround/datagridworkaround.zip

    (他的代码肯定是好用的,我测试过)

    如果不行,告诉我。

     


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

     谢谢斑竹的帮助,我在项目里测试了一下这个代码,是不行的,或许Sample里用的是Toolkit带的DataGrid,而我用的是.Net4.0里自带的DataGrid。Column依然无法找到相对的DataContext。

    我做了个DEMO,请帮忙看看谢谢!

    http://cid-7c49a2abb00e1af5.skydrive.live.com/redir.aspx?resid=7C49A2ABB00E1AF5!2706


    • 已编辑 懵盛盛 2011年4月9日 7:22 修改超链接
    2011年4月9日 7:20
  • 呵呵,周末出去玩了,所以今天才回复。

    我看你上传sample了,首先确定的是,这个问题的原因不是DataGrid4和toolkit 的DataGrid的问题。

    我看到你的绑定是类似下面这样做的:

    <DataGridTextColumn Binding="{Binding ColumnB}" Header="ColumnB" Width="*" Visibility="{Binding Path=IsChecked, ElementName=ckb_B, Converter={StaticResource Bool2VisibilityConverter}}"/>

    由于DataGridTextColumn和你的CheckBox并不是在一个Visualtree上,所以你的DataGridTextColumn并不能找到这个“ElementName=ckb_B”,所以这个绑定是没有办法工作的,当运行程序的时候你会在OutPut窗口中看到绑定的异常信息。

    要想使得DataGridTextColumn和CheckBox有交集,你必须要使得他俩都绑定到另一个属性上,比如:

    <CheckBox Content="ColumnA" x:Name="ckb_A" IsChecked="{Binding ShowA}"/>

    <DataGridTextColumn Binding="{Binding ColumnC}" Header="ColumnC" Width="*" Visibility="{Binding (FrameworkElement.DataContext).ShowA, RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource Bool2VisibilityConverter}}"/>

    第二个问题就是:

    <Window.DataContext>

        <local:ViewModel/>

    </Window.DataContext>

    你如果按照这种方式去赋值DataContext,这样你的这个函数:

    public static void OnDataContextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

    {

        DataGrid grid = d as DataGrid;

        if (grid != null)

        {

            foreach (DataGridColumn col in grid.Columns)

            {

                col.SetValue(FrameworkElement.DataContextProperty, e.NewValue);

            }

        }

    }

    就会在你的DataGrid生成Column之前执行,所以你要在代码中赋值DataContext,比如:

    this.DataContext = new ViewModel();

    这样你的问题就解决了。

     

    Best regards,


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 懵盛盛 2011年4月11日 13:24
    2011年4月11日 5:18
    版主
  • 呵呵,周末出去玩了,所以今天才回复。

    我看你上传sample了,首先确定的是,这个问题的原因不是DataGrid4和toolkit 的DataGrid的问题。

    我看到你的绑定是类似下面这样做的:

    <DataGridTextColumn Binding="{Binding ColumnB}" Header="ColumnB" Width="*" Visibility="{Binding Path=IsChecked, ElementName=ckb_B, Converter={StaticResource Bool2VisibilityConverter}}"/>

    由于DataGridTextColumn和你的CheckBox并不是在一个Visualtree上,所以你的DataGridTextColumn并不能找到这个“ElementName=ckb_B”,所以这个绑定是没有办法工作的,当运行程序的时候你会在OutPut窗口中看到绑定的异常信息。

    要想使得DataGridTextColumn和CheckBox有交集,你必须要使得他俩都绑定到另一个属性上,比如:

    <CheckBox Content="ColumnA" x:Name="ckb_A" IsChecked="{Binding ShowA}"/>

    <DataGridTextColumn Binding="{Binding ColumnC}" Header="ColumnC" Width="*" Visibility="{Binding (FrameworkElement.DataContext).ShowA, RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource Bool2VisibilityConverter}}"/>

    第二个问题就是:

    <Window.DataContext>

        <local:ViewModel/>

    </Window.DataContext>

     

    你如果按照这种方式去赋值DataContext,这样你的这个函数:

     

    public static void OnDataContextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

    {

        DataGrid grid = d as DataGrid;

        if (grid != null)

        {

            foreach (DataGridColumn col in grid.Columns)

            {

                col.SetValue(FrameworkElement.DataContextProperty, e.NewValue);

            }

        }

    }

     

    就会在你的DataGrid生成Column之前执行,所以你要在代码中赋值DataContext,比如:

     

    this.DataContext = new ViewModel();

    这样你的问题就解决了。

     

    Best regards,


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    谢谢谢耳朵的回复!

    问题已经按你的方案解决了,似乎Column的DataContext是一个BUG吧?不知道微软在下个版本会不会修正一下?毕竟这个功能还是有应用场景的

    2011年4月11日 13:25
  • 要想使得DataGridTextColumn和CheckBox有交集,你必须要使得他俩都绑定到另一个属性上,比如:

    <CheckBox Content="ColumnA" x:Name="ckb_A" IsChecked="{Binding ShowA}"/>

    <DataGridTextColumn Binding="{Binding ColumnC}" Header="ColumnC" Width="*" Visibility="{Binding (FrameworkElement.DataContext).ShowA, RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource Bool2VisibilityConverter}}"/>

    你好,我对这里的“ShowA”不是很理解,麻烦解释一下。

    2013年7月3日 2:42
  • Please any of you, anyone still have this source code?
    I need to solve this problem in my application and I am not understanding where to put this part of the code:

    FrameworkElement.DataContextProperty.AddOwner (typeof (DataGridColumn));
    FrameworkElement.DataContextProperty.OverrideMetadata (typeof (DataGrid),
    new FrameworkPropertyMetadata
        (null, FrameworkPropertyMetadataOptions.Inherits,
        new PropertyChangedCallback (OnDataContextChanged)));

    And I can not find anywhere a valid link to your example codes, or this post:
    https://blogs.msdn.microsoft.com/jaimer/2008/11/22/forwarding-the-datagrids-datacontext-to-its-columns/

    HELP !!!


    2018年3月8日 19:58