2017-03-16 123 views
0

我有一个有多个集合的类,这些集合是相互依赖的。 (想想DataTableColumnsRows)。 我想实现的是我可以将设置为DataGrid我的班级,并将列的绑定路径设置为第一个集合(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

绑定“如何实现这一目标?” - 将此数据结构转换为DataTable并将DataTable.DefaultView用作ItemsSource? – ASh

+0

这是不可能的,因为我们在PCL中有很多DataTable的问题,我们需要定制实现。 – Jownster

回答

1

通过继承Row对象中的DynamicObject,您可以重写GetDynamicMemberNames,TryGetIndex,TryGetMember,TrySetIndex,TrySetMember方法。 这些方法可以使用[] -indexers来获取或设置特定值(列)。

集中的行收集的的ItemsSource和设置在列中的值从的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; 
    } 
}