1

I have a lot of columns in WPF DataGrid containg orders, over 80. They can be visible or hidden depending on view options menu. For now I am doing options menu separately, orders view model separately, columns visibility and headers processing in OnAutoGeneratingColumn event. So I have 3 different classes (ViewOptions, OrdersViewModel, ViewOptionsViewModel) and a lot of logic in event handler. Also It will be necessary to modify code in 4 places on adding/removing columns.

Is there a better way to bind menu headers to columns headers, as well as binding columns visibility (DataGrid) to checkboxes in menu (ViewOptionsViewModel)?

This is a grid

View options to show/hide necessary columns

Community
  • 1
  • 1
Denys Kazakov
  • 472
  • 3
  • 17

1 Answers1

0

use binding ,When I checked the "Display Property 1 ,the Column visible

When I checked the "Display Property 1 ,the Column visible"

Xaml:

<Window x:Class="WpfApplication6.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:test="clr-namespace:WpfApplication6"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <test:Bool2Visibility x:Key="bool2Visibility"/>
        <test:BindingProxy x:Key="bpProperty1"/>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <StackPanel Orientation="Horizontal">
            <CheckBox  Content="Display Property1" IsChecked="{Binding Source={StaticResource  bpProperty1},Path=Data,Mode=OneWayToSource}"/>
        </StackPanel>
        <DataGrid Grid.Row="1" ItemsSource="{Binding}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="property1" Binding="{Binding Property1}" Visibility="{Binding Source={StaticResource  bpProperty1},Path=Data,Converter={StaticResource bool2Visibility}}"/>
                <DataGridTextColumn Header="property2" Binding="{Binding Property2}"/>
                <DataGridTextColumn Header="property3" Binding="{Binding Property3}"/> 
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
    </Window>

c# code:

  public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<TestData> list = new List<TestData>();
            for (int i = 0; i < 10; i++)
            {
                TestData item = new TestData();
                item.Property1 = "property1" + i.ToString();
                item.Property2 = "property2" + i.ToString();
                item.Property3 = "property3" + i.ToString(); 
                list.Add(item);
            }
            this.DataContext = list; 
        }
    }

    public class TestData
    {
        public string Property1 { get; set; }
        public string Property2 { get; set; }
        public string Property3 { get; set; } 

    }

    public class Bool2Visibility : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            bool flag = false;
            if (value != null)
            {
                flag = System.Convert.ToBoolean(value);
            }
            return flag ? Visibility.Visible : Visibility.Collapsed;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return null;
        }
    }


    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); }
        }

        // Using a DependencyProperty as the backing store for Data.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty DataProperty =
            DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
    }
zhaojingbo
  • 131
  • 6