2017-03-16 1 views
0

여러 컬렉션이있는 클래스가 있는데이 컬렉션은 서로에 따라 다릅니다. DataTableColumnsRows을 생각해보십시오. 달성하고자하는 것은 DataGridDataContext을 내 클래스로 설정하고 열의 바인딩 경로를 첫 번째 컬렉션 (DataTable.Column)의 항목으로 설정할 수 있다는 것입니다. 그러나 DataGrid은 두 번째 컬렉션의 항목 목록을 표시해야합니다. (DataTable.Rows)바인딩 경로를 리디렉션하는 방법은 무엇입니까?

public class MyClass 
{ 
    public List<object> Collection1 { get; set; } 
    public List<List<object>> Collection2 { get; set; } 

    public void AddBinding() 
    { 
     var myClass = new MyClass() 
     { 
      Collection1 = new List<object> 
      { 
       "Item1", 
       "Item2", 
       "Item3", 
       "Item4", 
      }, 
      Collection2 = new List<List<object>> 
      { 
       new List<object> 
       { 
        "Value1 linked to Item1", 
        "Value2 linked to Item2", 
        "Value3 linked to Item3", 
        "Value4 linked to Item4", 
       }, 
       new List<object> 
       { 
        "Value5 linked to Item1", 
        "Value6 linked to Item2", 
        "Value7 linked to Item3", 
        "Value8 linked to Item4", 
       }, 
      } 
     }; 

     var grid = new DataGrid(); 
     grid.DataContext = myClass; 

     grid.Columns.Add(new DataGridTextColumn() 
     { 
      Binding = new Binding("Item1") 
     }); 
     grid.Columns.Add(new DataGridTextColumn() 
     { 
      Binding = new Binding("Item2") 
     }); 
     grid.Columns.Add(new DataGridTextColumn() 
     { 
      Binding = new Binding("Item3") 
     }); 
     grid.Columns.Add(new DataGridTextColumn() 
     { 
      Binding = new Binding("Item4") 
     }); 
    } 
} 

가능한지 궁금한가요? 이것을 달성하는 방법을 아는 사람은 누구입니까?

+0

에서 바인딩으로 열에서 값을 ItemsSource로 행 수집을 설정하고 설정 -이 데이터 구조를 DataTable로 변환하고 DataTable.DefaultView를 ItemsSource로 사용합니까? – ASh

+0

PCL에서 DataTable에 많은 문제가있어 맞춤 구현이 필요하기 때문에 불가능합니다. – Jownster

답변

1

Row 개체에서 DynamicObject를 상속하면 GetDynamicMemberNames, TryGetIndex, TryGetMember, TrySetIndex, TrySetMember 메서드를 재정의 할 수 있습니다. 이러한 메서드를 사용하면 [] - 인덱스를 사용하여 특정 값 (Column)을 가져 오거나 설정할 수 있습니다.

는 "어떻게 이것을 달성하기 위해?"가 GridColumn

public class MyClass 
{ 
    public List<string> Columns { get; set; } 
    public List<MyRow> Rows { get; set; } 
} 

public class MyRow : DynamicObject 
{ 
    public MyClass OwnerClass { get; set; } 
    public List<object> Values { get; set; } 

    public override IEnumerable<string> GetDynamicMemberNames() 
    { 
     return OwnerClass.Columns; 
    } 

    public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) 
    { 
     if (indexes.Length == 1 && OwnerClass != null) 
     { 
      if (indexes[0] is string stringIndex && OwnerClass.Columns.Contains(stringIndex)) 
      { 
       result = Values[OwnerClass.Columns.IndexOf(stringIndex)]; 
       return true; 
      } 
      else if (indexes[0] is int intIndex) 
      { 
       result = Values[intIndex]; 
       return true; 
      } 
     } 
     result = null; 
     return false; 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     if ((!string.IsNullOrEmpty(binder.Name) && OwnerClass.Columns.Contains(binder.Name))) 
     { 
      result = Values[OwnerClass.Columns.IndexOf(binder.Name)]; 
      return true; 
     } 
     result = null; 
     return false; 
    } 

    public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value) 
    { 
     if (indexes.Length == 1 && OwnerClass != null) 
     { 
      if (indexes[0] is string stringIndex && OwnerClass.Columns.Contains(stringIndex)) 
      { 
       Values[OwnerClass.Columns.IndexOf(stringIndex)] = value; 
       return true; 
      } 
      else if (indexes[0] is int intIndex) 
      { 
       Values[intIndex] = value; 
       return true; 
      } 
     } 
     return false; 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     if ((!string.IsNullOrEmpty(binder.Name) && OwnerClass.Columns.Contains(binder.Name))) 
     { 
      Values[OwnerClass.Columns.IndexOf(binder.Name)] = value; 
      return true; 
     } 
     return false; 
    } 
} 
관련 문제