2016-10-10 5 views
0

主な質問? CheckBoxなしで最初の列を表示する理由CheckBoxを使用したWPF ListView

enter image description here

予想:

enter image description here

メインウィンドウ:

namespace ListExperiment 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      DataContext = new ListViewModel(); 
     } 
    } 
    public class ColumnDescriptor 
    { 
     public string HeaderText { get; set; } 

     public string DisplayMember { get; set; } 

     public string Type { get; set; } 
    } 

    public class ListViewModel 
    { 
     public ObservableCollection<Employee> Items { get; set; } 

     public ObservableCollection<ColumnDescriptor> Columns { get; private set; } 

     public ListViewModel() 
     { 
      Items = new ObservableCollection<Employee>(); 
      Items.Add(new Employee { Document = 43, FirstName = "Jhon", LastName = "Jhons", Id = 1, IsChecked = true }); 
      Items.Add(new Employee { Document = 41233, FirstName = "Jhon", LastName = "Jhons", Id = 2, IsChecked = true }); 
      Items.Add(new Employee { Document = 4343123, FirstName = "Jhon", LastName = "Jhons", Id = 3, IsChecked = false }); 
      Items.Add(new Employee { Document = 44324233, FirstName = "Jhon", LastName = "Jhons", Id = 4, IsChecked = true }); 

      this.Columns = new ObservableCollection<ColumnDescriptor> 
      { 
       new ColumnDescriptor { Type="CheckBox" }, 
       new ColumnDescriptor { HeaderText = "FirstName", DisplayMember = "FirstName", Type="Common" }, 
       new ColumnDescriptor { HeaderText = "LastName", DisplayMember = "LastName", Type="Common" } 
      }; 
     } 
    } 

    public class Employee : INotifyPropertyChanged 
    { 
     private bool isChecked; 

     public bool IsChecked 
     { 
      get 
      { 
       return isChecked; 
      } 

      set 
      { 
       isChecked = value; 
       RaisePropertyChanged("IsChecked"); 
      } 
     } 

     public string FirstName { get; set; } 

     public string LastName { get; set; } 

     public int Document { get; set; } 

     public int Id { get; set; } 

     public event PropertyChangedEventHandler PropertyChanged; 

     public void RaisePropertyChanged(string info) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(info)); 
      } 
     } 
    } 
} 

XAML:

<Window x:Class="ListExperiment.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:ListExperiment.TestPadWPF" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <DataTemplate x:Key="Chk_Field" DataType="{x:Type GridViewColumn}"> 
      <CheckBox IsChecked="{Binding IsChecked}" /> 
     </DataTemplate> 
    </Window.Resources> 
    <Grid> 
     <ListView ItemsSource="{Binding Items}"> 
      <ListView.View> 
       <GridView local:GridViewColumns.HeaderTextMember="HeaderText" local:GridViewColumns.DisplayMemberMember="DisplayMember" 
         local:GridViewColumns.ColumnsSource="{Binding Columns}"> 
       </GridView> 
      </ListView.View> 
     </ListView> 
    </Grid> 
</Window> 

CustomControl:

namespace ListExperiment.TestPadWPF 
{ 
    public static class GridViewColumns 
    { 
     [AttachedPropertyBrowsableForType(typeof(GridView))] 
     public static object GetColumnsSource(DependencyObject obj) 
     { 
      return (object)obj.GetValue(ColumnsSourceProperty); 
     } 

     public static void SetColumnsSource(DependencyObject obj, object value) 
     { 
      obj.SetValue(ColumnsSourceProperty, value); 
     } 

     // Using a DependencyProperty as the backing store for ColumnsSource. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty ColumnsSourceProperty = 
      DependencyProperty.RegisterAttached(
       "ColumnsSource", 
       typeof(object), 
       typeof(GridViewColumns), 
       new UIPropertyMetadata(
        null, 
        ColumnsSourceChanged)); 


     [AttachedPropertyBrowsableForType(typeof(GridView))] 
     public static string GetHeaderTextMember(DependencyObject obj) 
     { 
      return (string)obj.GetValue(HeaderTextMemberProperty); 
     } 

     public static void SetHeaderTextMember(DependencyObject obj, string value) 
     { 
      obj.SetValue(HeaderTextMemberProperty, value); 
     } 

     // Using a DependencyProperty as the backing store for HeaderTextMember. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty HeaderTextMemberProperty = 
      DependencyProperty.RegisterAttached("HeaderTextMember", typeof(string), typeof(GridViewColumns), new UIPropertyMetadata(null)); 


     [AttachedPropertyBrowsableForType(typeof(GridView))] 
     public static string GetDisplayMemberMember(DependencyObject obj) 
     { 
      return (string)obj.GetValue(DisplayMemberMemberProperty); 
     } 

     public static void SetDisplayMemberMember(DependencyObject obj, string value) 
     { 
      obj.SetValue(DisplayMemberMemberProperty, value); 
     } 

     // Using a DependencyProperty as the backing store for DisplayMember. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty DisplayMemberMemberProperty = 
      DependencyProperty.RegisterAttached("DisplayMemberMember", typeof(string), typeof(GridViewColumns), new UIPropertyMetadata(null)); 


     private static void ColumnsSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
     { 
      GridView gridView = obj as GridView; 
      if (gridView != null) 
      { 
       gridView.Columns.Clear(); 

       if (e.OldValue != null) 
       { 
        ICollectionView view = CollectionViewSource.GetDefaultView(e.OldValue); 
        if (view != null) 
         RemoveHandlers(gridView, view); 
       } 

       if (e.NewValue != null) 
       { 
        ICollectionView view = CollectionViewSource.GetDefaultView(e.NewValue); 
        if (view != null) 
        { 
         AddHandlers(gridView, view); 
         CreateColumns(gridView, view); 
        } 
       } 
      } 
     } 

     private static IDictionary<ICollectionView, List<GridView>> _gridViewsByColumnsSource = 
      new Dictionary<ICollectionView, List<GridView>>(); 

     private static List<GridView> GetGridViewsForColumnSource(ICollectionView columnSource) 
     { 
      List<GridView> gridViews; 
      if (!_gridViewsByColumnsSource.TryGetValue(columnSource, out gridViews)) 
      { 
       gridViews = new List<GridView>(); 
       _gridViewsByColumnsSource.Add(columnSource, gridViews); 
      } 
      return gridViews; 
     } 

     private static void AddHandlers(GridView gridView, ICollectionView view) 
     { 
      GetGridViewsForColumnSource(view).Add(gridView); 
      view.CollectionChanged += ColumnsSource_CollectionChanged; 
     } 

     private static void CreateColumns(GridView gridView, ICollectionView view) 
     { 
      foreach (var item in view) 
      { 
       GridViewColumn column; 
       if (((ColumnDescriptor)item).Type == "CheckBox") 
       { 
        Window window = Application.Current.MainWindow; 
        DataTemplate s = (DataTemplate)window.FindResource("Chk_Field"); 
        column = CreateColumn(gridView, item); 
        column.CellTemplate = s; 
       } 
       else 
       { 
        column = CreateColumn(gridView, item); 
       } 
       gridView.Columns.Add(column); 
      } 
     } 

     private static void RemoveHandlers(GridView gridView, ICollectionView view) 
     { 
      view.CollectionChanged -= ColumnsSource_CollectionChanged; 
      GetGridViewsForColumnSource(view).Remove(gridView); 
     } 

     private static void ColumnsSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
     { 
      ICollectionView view = sender as ICollectionView; 
      var gridViews = GetGridViewsForColumnSource(view); 
      if (gridViews == null || gridViews.Count == 0) 
       return; 

      switch (e.Action) 
      { 
       case NotifyCollectionChangedAction.Add: 
        foreach (var gridView in gridViews) 
        { 
         for (int i = 0; i < e.NewItems.Count; i++) 
         { 
          GridViewColumn column = CreateColumn(gridView, e.NewItems[i]); 
          gridView.Columns.Insert(e.NewStartingIndex + i, column); 
         } 
        } 
        break; 
       case NotifyCollectionChangedAction.Move: 
        foreach (var gridView in gridViews) 
        { 
         List<GridViewColumn> columns = new List<GridViewColumn>(); 
         for (int i = 0; i < e.OldItems.Count; i++) 
         { 
          GridViewColumn column = gridView.Columns[e.OldStartingIndex + i]; 
          columns.Add(column); 
         } 
         for (int i = 0; i < e.NewItems.Count; i++) 
         { 
          GridViewColumn column = columns[i]; 
          gridView.Columns.Insert(e.NewStartingIndex + i, column); 
         } 
        } 
        break; 
       case NotifyCollectionChangedAction.Remove: 
        foreach (var gridView in gridViews) 
        { 
         for (int i = 0; i < e.OldItems.Count; i++) 
         { 
          gridView.Columns.RemoveAt(e.OldStartingIndex); 
         } 
        } 
        break; 
       case NotifyCollectionChangedAction.Replace: 
        foreach (var gridView in gridViews) 
        { 
         for (int i = 0; i < e.NewItems.Count; i++) 
         { 
          GridViewColumn column = CreateColumn(gridView, e.NewItems[i]); 
          gridView.Columns[e.NewStartingIndex + i] = column; 
         } 
        } 
        break; 
       case NotifyCollectionChangedAction.Reset: 
        foreach (var gridView in gridViews) 
        { 
         gridView.Columns.Clear(); 
         CreateColumns(gridView, sender as ICollectionView); 
        } 
        break; 
       default: 
        break; 
      } 
     } 

     private static GridViewColumn CreateColumn(GridView gridView, object columnSource) 
     { 
      GridViewColumn column = new GridViewColumn(); 
      string headerTextMember = GetHeaderTextMember(gridView); 
      string displayMemberMember = GetDisplayMemberMember(gridView); 
      if (!string.IsNullOrEmpty(headerTextMember)) 
      { 
       column.Header = GetPropertyValue(columnSource, headerTextMember); 
      } 
      if (!string.IsNullOrEmpty(displayMemberMember)) 
      { 
       string propertyName = GetPropertyValue(columnSource, displayMemberMember) as string; 
       column.DisplayMemberBinding = new Binding(propertyName); 
      } 
      return column; 
     } 

     private static object GetPropertyValue(object obj, string propertyName) 
     { 
      if (obj != null) 
      { 
       PropertyInfo prop = obj.GetType().GetProperty(propertyName); 
       if (prop != null) 
        return prop.GetValue(obj, null); 
      } 
      return null; 
     } 
    } 
} 

編集:期待される結果gaved

実装:あなたは正しく列を初期化していない

namespace ListExperiment.TestPadWPF 
{ 
    public static class GridViewColumns 
    { 
     [AttachedPropertyBrowsableForType(typeof(GridView))] 
     public static object GetColumnsSource(DependencyObject obj) 
     { 
      return (object)obj.GetValue(ColumnsSourceProperty); 
     } 

     public static void SetColumnsSource(DependencyObject obj, object value) 
     { 
      obj.SetValue(ColumnsSourceProperty, value); 
     } 

     // Using a DependencyProperty as the backing store for ColumnsSource. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty ColumnsSourceProperty = 
      DependencyProperty.RegisterAttached(
       "ColumnsSource", 
       typeof(object), 
       typeof(GridViewColumns), 
       new UIPropertyMetadata(
        null, 
        ColumnsSourceChanged)); 


     [AttachedPropertyBrowsableForType(typeof(GridView))] 
     public static string GetHeaderTextMember(DependencyObject obj) 
     { 
      return (string)obj.GetValue(HeaderTextMemberProperty); 
     } 

     public static void SetHeaderTextMember(DependencyObject obj, string value) 
     { 
      obj.SetValue(HeaderTextMemberProperty, value); 
     } 

     // Using a DependencyProperty as the backing store for HeaderTextMember. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty HeaderTextMemberProperty = 
      DependencyProperty.RegisterAttached("HeaderTextMember", typeof(string), typeof(GridViewColumns), new UIPropertyMetadata(null)); 


     [AttachedPropertyBrowsableForType(typeof(GridView))] 
     public static string GetDisplayMemberMember(DependencyObject obj) 
     { 
      return (string)obj.GetValue(DisplayMemberMemberProperty); 
     } 

     public static void SetDisplayMemberMember(DependencyObject obj, string value) 
     { 
      obj.SetValue(DisplayMemberMemberProperty, value); 
     } 

     // Using a DependencyProperty as the backing store for DisplayMember. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty DisplayMemberMemberProperty = 
      DependencyProperty.RegisterAttached("DisplayMemberMember", typeof(string), typeof(GridViewColumns), new UIPropertyMetadata(null)); 


     private static void ColumnsSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
     { 
      GridView gridView = obj as GridView; 
      if (gridView != null) 
      { 
       gridView.Columns.Clear(); 

       if (e.OldValue != null) 
       { 
        ICollectionView view = CollectionViewSource.GetDefaultView(e.OldValue); 
        if (view != null) 
         RemoveHandlers(gridView, view); 
       } 

       if (e.NewValue != null) 
       { 
        ICollectionView view = CollectionViewSource.GetDefaultView(e.NewValue); 
        if (view != null) 
        { 
         AddHandlers(gridView, view); 
         CreateColumns(gridView, view); 
        } 
       } 
      } 
     } 

     private static IDictionary<ICollectionView, List<GridView>> _gridViewsByColumnsSource = 
      new Dictionary<ICollectionView, List<GridView>>(); 

     private static List<GridView> GetGridViewsForColumnSource(ICollectionView columnSource) 
     { 
      List<GridView> gridViews; 
      if (!_gridViewsByColumnsSource.TryGetValue(columnSource, out gridViews)) 
      { 
       gridViews = new List<GridView>(); 
       _gridViewsByColumnsSource.Add(columnSource, gridViews); 
      } 
      return gridViews; 
     } 

     private static void AddHandlers(GridView gridView, ICollectionView view) 
     { 
      GetGridViewsForColumnSource(view).Add(gridView); 
      view.CollectionChanged += ColumnsSource_CollectionChanged; 
     } 

     private static void CreateColumns(GridView gridView, ICollectionView view) 
     { 
      foreach (var item in view) 
      { 
       GridViewColumn column = CreateColumn(gridView, item); 
       gridView.Columns.Add(column); 
      } 
     } 

     private static void RemoveHandlers(GridView gridView, ICollectionView view) 
     { 
      view.CollectionChanged -= ColumnsSource_CollectionChanged; 
      GetGridViewsForColumnSource(view).Remove(gridView); 
     } 

     private static void ColumnsSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
     { 
      ICollectionView view = sender as ICollectionView; 
      var gridViews = GetGridViewsForColumnSource(view); 
      if (gridViews == null || gridViews.Count == 0) 
       return; 

      switch (e.Action) 
      { 
       case NotifyCollectionChangedAction.Add: 
        foreach (var gridView in gridViews) 
        { 
         for (int i = 0; i < e.NewItems.Count; i++) 
         { 
          GridViewColumn column = CreateColumn(gridView, e.NewItems[i]); 
          gridView.Columns.Insert(e.NewStartingIndex + i, column); 
         } 
        } 
        break; 
       case NotifyCollectionChangedAction.Move: 
        foreach (var gridView in gridViews) 
        { 
         List<GridViewColumn> columns = new List<GridViewColumn>(); 
         for (int i = 0; i < e.OldItems.Count; i++) 
         { 
          GridViewColumn column = gridView.Columns[e.OldStartingIndex + i]; 
          columns.Add(column); 
         } 
         for (int i = 0; i < e.NewItems.Count; i++) 
         { 
          GridViewColumn column = columns[i]; 
          gridView.Columns.Insert(e.NewStartingIndex + i, column); 
         } 
        } 
        break; 
       case NotifyCollectionChangedAction.Remove: 
        foreach (var gridView in gridViews) 
        { 
         for (int i = 0; i < e.OldItems.Count; i++) 
         { 
          gridView.Columns.RemoveAt(e.OldStartingIndex); 
         } 
        } 
        break; 
       case NotifyCollectionChangedAction.Replace: 
        foreach (var gridView in gridViews) 
        { 
         for (int i = 0; i < e.NewItems.Count; i++) 
         { 
          GridViewColumn column = CreateColumn(gridView, e.NewItems[i]); 
          gridView.Columns[e.NewStartingIndex + i] = column; 
         } 
        } 
        break; 
       case NotifyCollectionChangedAction.Reset: 
        foreach (var gridView in gridViews) 
        { 
         gridView.Columns.Clear(); 
         CreateColumns(gridView, sender as ICollectionView); 
        } 
        break; 
       default: 
        break; 
      } 
     } 

     private static GridViewColumn CreateColumn(GridView gridView, object columnSource) 
     { 
      Window window = Application.Current.MainWindow; 
      DataTemplate CheckBoxTemplate = (DataTemplate)window.FindResource("Chk_Field"); 

      GridViewColumn column = new GridViewColumn(); 
      string headerTextMember = GetHeaderTextMember(gridView); 
      string displayMemberMember = GetDisplayMemberMember(gridView); 
      if (!string.IsNullOrEmpty(headerTextMember)) 
      { 
       column.Header = GetPropertyValue(columnSource, headerTextMember); 
      } 
      if (!string.IsNullOrEmpty(displayMemberMember)) 
      { 
       string propertyName = GetPropertyValue(columnSource, displayMemberMember) as string; 
       string columnType = ((ColumnDescriptor)columnSource).Type; 
       switch (columnType) 
       { 
        case "Common": 
         column.DisplayMemberBinding = new Binding(propertyName); 
         break; 
        case "CheckBox": 
         column.CellTemplate = CheckBoxTemplate; 
         break; 
       } 
      } 
      return column; 
     } 

     private static object GetPropertyValue(object obj, string propertyName) 
     { 
      if (obj != null) 
      { 
       PropertyInfo prop = obj.GetType().GetProperty(propertyName); 
       if (prop != null) 
        return prop.GetValue(obj, null); 
      } 
      return null; 
     } 
    } 
} 

答えて

0

を、これを追加します。

this.Columns = new ObservableCollection<ColumnDescriptor> 
     { 
      new ColumnDescriptor { HeaderText = "IsChecked", DisplayMember = "IsChecked",Type="CheckBox" }, 
      new ColumnDescriptor { HeaderText = "FirstName", DisplayMember = "FirstName", Type="Common" }, 
      new ColumnDescriptor { HeaderText = "LastName", DisplayMember = "LastName", Type="Common" } 
     }; 

方法をGetPropertyValue(columnSource、headerTextMember)を呼び出したときにnullを返し、 tバインド。

+0

あなたの提案にチェックボックスは表示されません。 – A191919

関連する問題