2016-03-09 3 views
0

У меня есть много столбцов в WPF DataGrid, содержащих заказы более 80. Они могут быть видимыми или скрытыми в зависимости от меню опций просмотра. На данный момент я делаю меню параметров отдельно, модель просмотра заказов отдельно, видимость столбцов и обработка заголовков в событии OnAutoGeneratingColumn. Таким образом, у меня есть 3 разных класса (ViewOptions, OrdersViewModel, ViewOptionsViewModel) и много логики в обработчике событий. Также необходимо будет изменить код в 4 местах при добавлении/удалении столбцов.Гибкий способ показать много столбцов в datagrid

Есть ли лучший способ привязать заголовки меню к заголовкам столбцов, а также привязать видимость столбцов в меню (ViewOptionsViewModel) к видимым столбцам (DataGrid)?

This is a grid

View options to show/hide necessary columns

ответ

0

использование связывания, когда я проверил «Display Property 1, колонка видимую

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# треска e:

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)); 
    } 
Смежные вопросы