2017-12-07 217 views
0

私はDatagridと親DataGrid内にネストされた別のDataGridを持っています。子DataGridのItemSourceを親DataContextのプロパティとして設定する必要があります。親のdatacontextを取得するために子項目ソースのRelativeSourceを使用しようとしました。「ItemsSourceを使用する前にアイテムコレクションを空にする必要があります。 WPFで子DataGridのitemsourceを設定しようとしています

XAMLコード

<DataGrid Grid.Row ="1" x:Name="Grid1" ItemsSource="{Binding Path=md,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Categogy" Width="100" Binding="{Binding Path =CateName,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
     <DataGridTemplateColumn Header="Characterictics" Width="300"> 
      <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <DataGrid ItemsSource="{Binding DataContext.list, RelativeSource={RelativeSource AncestorType=DataGrid}}"> 
       <DataGridTextColumn Binding="{Binding DataContext.list.Name, RelativeSource={RelativeSource AncestorType=DataGrid}}" /> 
       </DataGrid> 
      </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

のViewModel

Model m = new Model(); 
m.CateName = "CategoryName"; 
m.list.Add(new Characteristics() { Name="XX", Value="00"}); 
m.list.Add(new Characteristics() { Name = "XX", Value = "00" }); 
m.list.Add(new Characteristics() { Name = "XX", Value = "00" }); 
md.Add(m); 

Model m1 = new Model(); 
m1.CateName = "CategoryName1"; 
m1.list.Add(new Characteristics() { Name = "XX", Value = "00" }); 
m1.list.Add(new Characteristics() { Name = "XX", Value = "00" }); 
m1.list.Add(new Characteristics() { Name = "XX", Value = "00" }); 
md.Add(m1); 

list = new ObservableCollection<Characteristics>(); 
list.Add(new Characteristics() { Name = "XX", Value = "00" }); 
list.Add(new Characteristics() { Name = "XX", Value = "00" }); 

特性クラスは、プロパティ名とモデルを持っています。

今、「ItemsSourceを使用する前にItemsコレクションが空である必要があります」というような例外が発生しています。

どこが間違っているのかわかりません。 誰かが、子のdataGrid Itemsourceを正しくバインドするのを手伝ってもらえますか? <DataGrid.Columns>タグ

<DataGrid ItemsSource="{Binding list}"> 
    <DataGrid.Columns> 
    <DataGridTextColumn Binding="{Binding Name}" /> 
    </DataGrid.Columns> 
</DataGrid> 

にネストされたデータグリッド場所DataGridTextColumnため

答えて

0

私はあなたがこの

<DataGrid Grid.Row ="1" x:Name="Grid1" ItemsSource="{Binding Path=md,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Categogy" Width="100" Binding="{Binding Path =CateName,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
       <DataGridTemplateColumn Header="Characterictics" Width="600"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <DataGrid AutoGenerateColumns="False" Height="100" ItemsSource="{Binding list}"> 
           <DataGrid.Columns> 
            <DataGridTextColumn Header="Name" Binding="{Binding Name}" /> 
           </DataGrid.Columns> 
          </DataGrid> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
を試すことができると思います

編集:あなたは窓 のDataContextのからリストを使用する場合は

<DataGrid AutoGenerateColumns="False" Height="100" ItemsSource="{Binding list,RelativeSource={RelativeSource AncestorType=Window}}"> 
           <DataGrid.Columns> 
            <DataGridTextColumn Header="Name" Binding="{Binding Name}" /> 
           </DataGrid.Columns> 
          </DataGrid> 

のViewModelとして、ネストされたdataridを変更してください:

public partial class MainWindow : Window 
    { 
     private ObservableCollection<Model> _md = new ObservableCollection<Model>(); 
     public ObservableCollection<Model> md 
     { 
      get { return _md; } 
      set { _md = value; } 
     } 

     private ObservableCollection<Characteristics> _list; 
     public ObservableCollection<Characteristics> list 
     { 
      get { return _list; } 
      set { _list = value; } 
     } 
     public MainWindow() 
     { 
      InitializeComponent(); 

      this.DataContext = this; 

      Model m = new Model(); 
      m.CateName = "CategoryName"; 
      m.list.Add(new Characteristics() { Name = "test Name", Value = "00" }); 
      m.list.Add(new Characteristics() { Name = "TEst name1", Value = "00" }); 
      m.list.Add(new Characteristics() { Name = "XX", Value = "00" }); 
      md.Add(m); 

      Model m1 = new Model(); 
      m1.CateName = "CategoryName1"; 
      m1.list.Add(new Characteristics() { Name = "XX", Value = "00" }); 
      m1.list.Add(new Characteristics() { Name = "XX", Value = "00" }); 
      m1.list.Add(new Characteristics() { Name = "XX", Value = "00" }); 
      md.Add(m1); 

      list = new ObservableCollection<Characteristics>(); 
      list.Add(new Characteristics() { Name = "vali", Value = "00" }); 
      list.Add(new Characteristics() { Name = "XX", Value = "00" }); 

     }  
    } 

    public class Model 
    { 
     private string cateName; 
     public string CateName 
     { 
      get { return cateName; } 
      set { cateName = value; } 
     } 

     private List<Characteristics> _list = new List<Characteristics>(); 

     public List<Characteristics> list 
     { 
      get { return _list; } 
      set { _list = value; } 
     } 
    } 

    public class Characteristics 
    { 
     private string name; 
     public string Name 
     { 
      get { return name; } 
      set { name = value; } 
     } 

     private string value; 

     public string Value 
     { 
      get { return this.value; } 
      set { this.value = value; } 
     } 
    } 
2

そうDataGridTextColumnが項目として解釈してのItemsSource

でエラーが発生しても、バインディングを修正している、彼らは親のDataContextを使用する必要はありませんが

+0

感謝を! を追加すると、例外を回避できました。しかし、子DataGridのバインディングは機能しません。私はを使ってあなたの意見を聞きました。しかし、グリッドにはデータはありません。 –

+0

@SudiptaSahaは、カテゴリ(CateName)が正しくバインドされている最初の列ですか?親DataGridのdataContextと特に 'md'を表示してください。 *フィールド* – ASh

+0

カテゴリが第1列に適切に表示されているのではなく、getter/setter everythereでpublic * properties *を持っていることを確認してください。私は私のviewmodelで定義されたmdという名前のパブリックプロパティで親のDataGridをバインドしました。私が使用しているモデルは次のようなものです:public class Model { 公開ストリングCateName { get; set; } private ObservableCollection <特性> _list = new ObservableCollection <特性>(); public ObservableCollection <特性>リスト { get {return _list; } セット{ _list = value; } } } –

関連する問題