Binding Visibility for DataGridColumn in WPF

前端 未结 2 1317
梦谈多话
梦谈多话 2020-11-22 09:24

How can I hide a column in a WPF DataGrid through a Binding?

This is what I did:



        
2条回答
  •  北恋
    北恋 (楼主)
    2020-11-22 09:50

    First of all DataGridTextColumn or any other supported dataGrid columns doesn't lie in Visual tree of DataGrid. Hence, by default it doesn't inherit DataContext of DataGrid. But, it works for Binding DP only and for not other DP's on DataGridColumn.

    Since, they doesn't lie in same VisualTree so any try to get DataContext using RelativeSource won't work as well because DataGrid won't able to traverse up to DataGrid.

    There are two ways to achieve that though:


    First using Freezable class - Freezable objects can inherit the DataContext even when they’re not in the visual or logical tree. So, we can take advantage of that to our use.

    First create class inheriting from Freezable and Data DP which we can use to bind in XAML:

    public class BindingProxy : Freezable
    {
        #region Overrides of Freezable
    
        protected override Freezable CreateInstanceCore()
        {
            return new BindingProxy();
        }
    
        #endregion
    
        public object Data
        {
            get { return (object)GetValue(DataProperty); }
            set { SetValue(DataProperty, value); }
        }
    
        public static readonly DependencyProperty DataProperty =
            DependencyProperty.Register("Data", typeof(object),
                                         typeof(BindingProxy));
    }
    

    Now, add an instance of it in DataGrid resources so that it can inherit DataGrid's DataContext and then can bind with its Data DP:

        
            
                
            
            
                
            
        
    

    Second, you can refer to any UI element in XAML using ElementName or x:Reference. But ElementName works only in same visual tree whereas x:Reference doesn't have such constraint.

    So, we can use that as well to our advantage. Create dummy FrameworkElement in XAML with Visibility set to collapsed. FrameworkElement will inherit DataContext from it's parent container which can be Window or UserControl.

    And can use that in DataGrid:

        
        
            
                
            
        
    

提交回复
热议问题