2017-03-16 6 views
0

私は複数のコレクションを持つクラスを持っていますが、これらのコレクションはお互いに依存しています。 (DataTableColumnsRowsと考えてください)。 私が達成したいのは、DataGridDataContextを自分のクラスに設定し、列のバインディングパスを最初のコレクション(DataTable.Column)の項目に設定できることです。 DataGridには、2番目のコレクションのアイテムのリストが表示されます。 (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に変換し、ItemsSourceとしてDataTable.DefaultViewを使用しますか? – ASh

+0

PCLでDataTableに問題が発生しており、カスタム実装が必要なため、これは不可能です。 – Jownster

答えて

1

DynamicObjectをRowオブジェクトに継承することにより、メソッドGetDynamicMemberNames、TryGetIndex、TryGetMember、TrySetIndex、TrySetMemberをオーバーライドできます。 これらのメソッドを使用すると、[] -indexersを使用して特定の値(Column)を取得または設定できます。

はのItemsSourceとしてRowsコレクションを設定し、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; 
    } 
} 
関連する問題