2011-08-15 13 views
3

これは私が取り組んでいるユーザーコントロールです。最初のcomboBoxの項目は、dataGridColumn GroupIDで同じになるでしょう。DataGridの内部のコンボボックスにデータをバインドするにはどうすればよいですか?

enter image description here

最初のコンボボックスに表示するコードは

<ComboBox ItemsSource="{Binding}" Name="GroupComboBox" SelectedValuePath="GroupID" DisplayMemberPath="GroupName" Grid.Column="1" Margin="5" /> 

    private void LoadGroups() 
    { 
     NorthwindDataContext dc = new NorthwindDataContext(); 

     var groups = (from p in dc.Group 
         select p); 

     this.DataContext = groups; 
    } 

    private void LoadStudents() 
    { 
     NorthwindDataContext dc = new NorthwindDataContext(); 

     var students = (from p in dc.Student 
         select p); 

     dataGrid1.ItemsSource = students; 
    } 

である。しかし、別のコンボボックスで、それに任意の項目を表示されません。

  <DataGridTemplateColumn Header="GroupID"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox ItemsSource="{Binding}" SelectedValuePath="GroupID" DisplayMemberPath="GroupName" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

どのようにバインドできますか?

私はすべてのグループをリストに入れることを考えていましたが、リスト内でクエリを変換する必要があるため、それは良い方法になるとは思えません。

UPDATE 1:

私は、この行削除する必要がありました:グループクラスを作成します

  <DataGridTemplateColumn Header="GroupID"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox ItemsSource="{Binding DataContext, RelativeSource={RelativeSource AncestorType=UserControl}}" SelectedValuePath="GroupID" DisplayMemberPath="GroupName" SelectedValue="{Binding GroupID}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
+0

それが結合することになると異なるのUIは非常に異なっているように私は、WPFで再タグ付けを示唆しています。ありがとう。 – Jay

+0

この投稿のタグを編集してWPFを追加すると、データベースおよび/またはlinqを削除することもできます。あなたの質問に適切なタグを付けることは、あなたの投稿に適切な専門家を引き付けるために非常に重要です。 – Jay

+0

ああそうです、最も重要なタグを忘れました –

答えて

1

社内のコンボボックスの結合が機能しませんそのコンボボックスのDataContextのは、あなたのGroupsコレクションが、Studentsの一つであるので、これは{Binding}ItemsSourceを設定するとStudentItemsSourceを作ることを意味します。

継承されたDataContextが依然としてGroupsコレクションである場所へのRelativeSourceバインディングを使用して、ツリーを上に移動できます。 inheritanceはこの中間にDataContextが動作する設定によってブロックされていない場合:

{Binding DataContext, RelativeSource={RelativeSource AncestorType=DataGrid}} 
+0

まだ動作していません。最初のComboBoxは大丈夫ですが、別のComboBoxは大丈夫です。私はこれをするのが間違っていると思いますか? this.DataContext = groups; –

+0

@ oscar.imbres:そうですが、私のバインディングはそれを説明することを目的としていました。 UserControlとDataGridの間のツリーの任意のポイントでDataContextを設定しますか? –

+0

@ oscar.imbres: 'AncestorType'を' UserControl'に変更するだけで、上部にナビゲートして 'this.DataContext'を取得します。これはもう少しパフォーマンスが強いかもしれません。 (私が 'this.DataContext'が間違っていると言った理由は、通常はUserControlsが外部からDataContextを継承できるようにしたいからです。それを設定しても動作しない場合) –

0

ため

  <DataGridComboBoxColumn Header="GroupID" ItemsSource="{Binding DataContext, RelativeSource={RelativeSource AncestorType=UserControl}}" SelectedValuePath="GroupID" DisplayMemberPath="GroupName" /> 

をし、そのクラスのパブリックリストの学生が含まれています。私は同じ名前を持っていないが、私はあなたが求めているもの(私が思う)を機能的にやっている。この例では、各ワークフローは複数のバッチとして扱われます。 2番目のリストボックスは、WFEnumで選択された項目にバインドされます。 SelectedItem.Studentsを使用して、選択したグループのStudentコレクションを取得する必要があります。これは作業中の生産コードからのものです。 ElementNameはコントロールにバインドするよう指示します。

<ListBox Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="1" Name="WFEnum" 
      ItemsSource="{Binding Path=SearchItem.SrchWorkFlows}" 
      DisplayMemberPath="Name"}"> 
    ... 
    <ListBox Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="1" Name="WFBatchEnum" 
      ItemsSource="{Binding SelectedItem.Batches, ElementName=WFEnum}" 
      DisplayMemberPath="BatchName" SelectedValuePath="ID" 
      HorizontalAlignment="Left"/> 

希望すると、これはクラスワークフローに役立ちます。 WorkFlowにはパブリックリストバッチがあります(学生用)。この場合、私はオンデマンドでSQLから生徒を取得するだけですが、取得したらリストを保存して、次回はSQLに戻ってはいけません。 WPFとデータバインディングは複雑ですが、すばらしいです。

public class Workflow : INotifyPropertyChanged 
    { 
     private Int16 id; 
     private string name; 
     private string description;  
     private Boolean active; 
     private User createdBy; 
     private DateTime createDate; 
     private List<WFBatch> batches = new List<WFBatch>(); 

     public event PropertyChangedEventHandler PropertyChanged; 
     protected void NotifyPropertyChanged(String info) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(info)); 
      } 
     } 

     public Int16 ID { get { return id; } } 
     public string Name { get { return name; } } 
     public string Description { get { return description; } }   
     public Boolean Active { get { return active; } } 
     public User CreatedBy { get { return createdBy; } } 
     public DateTime CreateDate { get { return createDate; } } 
     public WFBatch newWFbatch { get { return new WFBatch(this, App.StaticGabeLib.Search.IncludeFamilySrched); } } 
     public List<WFBatch> Batches 
     { 
      get 
      { 
       // get the latest from SQL 
       // todo optimize - this for now will a SQL call for all batches here 
       if (batches.Count > 0) return batches; 
       SqlConnection sqlConnRW2 = new SqlConnection(sqlConnStringLibDef); 
       try 
       { 
        sqlConnRW2.Open(); 
        SqlCommand sqlCmd2 = new SqlCommand(); 
        sqlCmd2.Connection = sqlConnRW2; 
        SqlDataReader rdr; 
        sqlCmd2.CommandText = sqlCmd2.CommandText = "Select [ID] from [wfBch] with (nolock) " + Environment.NewLine + 
         "where [wfID] = '" + ID.ToString() + "' order by [ID] "; 
        rdr = sqlCmd2.ExecuteReader(); 
        while (rdr.Read()) 
        { 
         batches.Add(new WFBatch(this, rdr.GetInt16(0))); 
        } 
       } 
       catch (Exception Ex) 
       { 
        Debug.WriteLine(Ex.Message); 
       } 
       finally 
       { 
        sqlConnRW2.Close(); 
       } 
       return batches; 
      } 
     } 
     public Workflow(Int16 ID, string Name, string Description, Boolean Active, User CreatedBy, DateTime CreateDate) 
     { 
      id = ID; 
      name = Name; 
      description = Description; 
      active = Active; 
      createdBy = CreatedBy; 
      createDate = CreateDate; 
      // WFBatch wfBatch = new WFBatch(this); 
      // todo retreive batches 
     }   
    } 
+0

私はそれを取得しようとしています。申し訳ありませんが、私はまだWPFの初心者です。 –

関連する問題