2010-07-08 57 views
0

我有一個DataGrid,它的兩列是ComboBoxes(一個包含少數,但不是這個問題)。訪問DataGridCells,動態級聯ComboBoxes之間的控制

我想,當用戶更改第一個組合框的值時,另一列中的組合框應綁定到其屬性(此屬性是一個集合)。說第一個組合框是類別,我希望當用戶改變它的值時,另一個CB填充(首先組合選擇的類別).Vendors的值。

我應該怎麼做,我不使用MVVM,只是簡單的WPF。 我不知道應該採取什麼正確的方式來實施它,我希望我能夠開始正確的做法。

我想,如果我可以從第一個SelectionChangeHandler獲得最好的另一個ComboBox(它位於不同的DataGridCell中),因爲那樣我可以在第一個選擇更改時重置它的源。 請注意,我有能力達到當前(第一個)DataGridCell,我只是尋找一種有效的方式來訪問正確的DataGridCell兄弟,然後得到它的孩子(第二)組合。

另請注意,所選的類別應因行而異,第二個ComboBox應取決於此行的類別。
我實際上試圖實現它,以便CollectionViewSource.Source綁定到當前項目(即行的DataContext),但它似乎不工作。
我更喜歡在第一個ComboBox的SelectionChange中通過Action觸發器或處理程序設置第二個組合框的CollectionViewSource(VendorsCollection)。

該字段中的其他ComboBoxes似乎沒有問題,因爲它們都是彼此綁定的,我可能會使用CollectionViewSource.Filter,無論如何,訪問它們不是問題,因爲它們是簡單的兄弟姐妹,不是就像第一個位於另一個DataGridCell深處的遠房親戚一樣。

這裏是什麼是什麼我試過到目前爲止:

<DataGrid> 
    <DataGrid.Resources> 
     <CollectionViewSource x:Key="CategoriesCollection" Source="{Binding Context.CategoriesList, Source={x:Static Application.Current}, IsAsync=True}" /> 
    </DataGrid.Resources> 

    <DataGrid.Columns> 

     <DataGridTemplateColumn Header="Category"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock DataContext="{Binding Category}" Text="{Binding Title}"/> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
      <DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
        <!--This is the first ComboBox--> 
        <ComboBox 
           IsSynchronizedWithCurrentItem="False" 
           ItemsSource="{Binding Source={StaticResource CategoriesCollection}}" 
           DisplayMemberPath="Title" 
           SelectionChanged="cbCategories_SelectionChanged" 
           SelectedItem="{Binding Category}"/> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellEditingTemplate> 
     </DataGridTemplateColumn> 

     <DataGridTemplateColumn Header="Style"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock DataContext="{Binding Finish.Style.Vendor}" Text="{Binding Contact.Title}"/> 
         <TextBlock DataContext="{Binding Finish.Style}" Text="{Binding Title}"/> 
         <TextBlock Text="{Binding Finish.Title}"/> 
        </StackPanel> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
      <DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <StackPanel.Resources> 
          <!--I want, that when the user selects a value in the first ComboBox, 
        the VendorsCollection below should be populated with the selected Category.Vendors, 
        or alternatively current row's data item.Category.Vendors, 
        I just donno how to access current row from these resources.--> 
          <CollectionViewSource x:Key="VendorsCollection" Source="{Binding Vendors, Source={StaticResource CategoriesCollection}}" /> 
          <CollectionViewSource x:Key="StylesCollection" Source="{Binding Styles, Source={StaticResource VendorsCollection}}" /> 
          <CollectionViewSource x:Key="FinishesCollection" Source="{Binding Finishes, Source={StaticResource StylesCollection}}" /> 
         </StackPanel.Resources> 
         <ComboBox              
            IsSynchronizedWithCurrentItem="True" 
            ItemsSource="{Binding Source={StaticResource VendorsCollection}}" 
            SelectedItem="{Binding Finish.Style.Vendor}" 
            DisplayMemberPath="Contact.Title"/> 
         <ComboBox 
            IsSynchronizedWithCurrentItem="True" 
            ItemsSource="{Binding Source={StaticResource StylesCollection}}" 
            SelectedItem="{Binding Finish.Style}" 
            DisplayMemberPath="Title"/> 
         <ComboBox 
            IsSynchronizedWithCurrentItem="True" 
            ItemsSource="{Binding Source={StaticResource FinishesCollection}}" 
            SelectedItem="{Binding Finish}" 
            DisplayMemberPath="Title"/> 
        </StackPanel> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellEditingTemplate> 
     </DataGridTemplateColumn> 

    </DataGrid.Columns> 
</DataGrid> 

回答

0

我只是碰到你的問題就來了。你的問題解決了嗎?我認爲你的問題與我得到的this one類似。希望那裏的解決方案也能幫助你。