2016-03-09 49 views
0

我有很多在WPF DataGrid包含訂單,超過80個列。它們可以是可見或隱藏取決於視圖選項菜單。現在我正在做選項菜單,單獨訂購查看模型,在OnAutoGeneratingColumn事件中分欄查看和標題處理。所以我有3個不同的類(ViewOptions,OrdersViewModel,ViewOptionsViewModel)和事件處理程序中的很多邏輯。此外,有必要在添加/刪除列的4個地方修改代碼。靈活的方式來顯示數據網格中的很多列

是否有更好的方式來綁定菜單標題列標題,以及綁定列可見性(DataGrid)菜單(ViewOptionsViewModel)複選框?

This is a grid

View options to show/hide necessary columns

回答

0

使用綁定,當我檢查「顯示屬性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)); 
    } 
相關問題