2009-07-28 18 views
1

ねえ、そこに!ここで私の質問です:WPF DataGridコンボボックス列:ヘッダーコンボボックスを列全体に伝播

私はWPFでDatagridを持って、私はDataGridComboBoxColumnである最初の列を持っています。

私がしたいのは、その列のヘッダーにもコンボボックスを付けることです。列全体に伝播してヘッダーを変更します。

私はこれを視覚的に行うことができますが、データを送信すると、データグリッドにバインドされているリストには新しいコンボボックスの値は反映されません。私は次のコードを持っているComboBox_SelectionChangedで

<dg:DataGridComboBoxColumn SelectedItemBinding="{Binding BIBStatus}"            
          ItemsSource="{Binding Source={StaticResource typeStatus}}" 
          Width="0.20*"> 
        <dg:DataGridComboBoxColumn.HeaderTemplate> 
         <DataTemplate> 
          <StackPanel> 
           <TextBlock Text="Built-In Bridge"/> 
           <ComboBox SelectedItem="{Binding BIBStatus}" 
              SelectionChanged="ComboBox_SelectionChanged" 
              ItemsSource="{Binding Source={StaticResource typeStatus}}"/> 
          </StackPanel>         
         </DataTemplate> 
        </dg:DataGridComboBoxColumn.HeaderTemplate> 
       </dg:DataGridComboBoxColumn> 

DataGridColumn comboCol = this.gridResults.Columns[0]; 

     for (int i = 0; i < this.gridResults.Items.Count; i++) 
     { 
      ComboBox myCmBox = (comboCol.GetCellContent(this.gridResults.Items[i]) as ComboBox); 

      myCmBox.SelectedValue = ((ComboBox)sender).SelectedValue; 
     } 

私はデータを送信すると、私はデータグリッドへのDataContextあるリストを提出します。一度に行をアドレス指定する最初の列の値を変更した場合、つまり各行のコンボボックスでセルをクリックすると、値はDataContextのリストに伝播されますが、最初の列の値をヘッダーで変更するとそれはしません。

誰かが私に行方不明を教えてもらえますか?私はそれが私は各行に影響する方法だと思いますが、私はSelectedValue、SelectedItemとSelectedIndexを試してみました...すべて無駄に。

事前のおかげで...

+0

双方向データバインディングを行っているので、データソースを変更すると、コンボボックスの選択項目が変更されます。 BIBStatusを直接設定するとどうなりますか? –

+0

私はそれについて考えました:)しかし、問題は、編集するためにクリックすると各行のコンボボックスが更新されるだけです。そうでなければ各行は同じままです。 各行のコンボボックスでSelectionChangedイベントをトリガーすることが問題であると推測しています。各行の値を選択するとデータバインディングが機能するためです。コード内のコンボボックスの値を編集すると、そのSelectionChangedイベントはUIで発生しないため、トリガされません...推測しますか? – LostKaleb

答えて

0

私はそれを解決...か、少なくともそれを偽装しているかもしれないと思う...

DataGridColumn comboCol = this.gridResults.Columns[0]; 

     for (int i = 0; i < this.gridResults.Items.Count; i++) 
     { 
      ComboBox myCmBox = (comboCol.GetCellContent(this.gridResults.Items[i]) as ComboBox); 
      myCmBox.SelectedItem = ((ComboBox)sender).SelectedItem; 
     } 

     if (this._results != null) 
     { 
      foreach (Device device in _results) 
      { 
       device.BIBStatus = (TypeStatus)Enum.ToObject(typeof(TypeStatus), ((ComboBox)sender).SelectedValue); 
      } 
     } 

私はのための唯一のDataContextと希望を変更しようとしました双方向のバインディングが機能するようになりましたが、各行のコンボボックスに焦点を当てていたときだけでした。だから私は思った: "なぜ両方の方法ではない?" ご覧のとおり、コンボボックスの選択項目と各デバイスのBIBステータス(datacontext部分)の両方を変更します。このようにして、私は望みの効果を得ます。

しかし、私はこのソリューションが最高のものだとは思っていません。私はまだ犯罪者でなくてもこれをやり遂げることができると考えています。

まだお勧めできません。