wpf模板组合框中的选择更改列更改其他行中的值

wpf模板组合框中的选择更改列更改其他行中的值

问题描述:

在我的项目中,我有一个包含三个组合框模板列的数据网格,并且数据绑定到三个集合,并且这些列是可编辑的。第二个和第三个组合框中的集合根据第一列中组合框的选定索引进行选择,当我更改任何行中第一列中的选择时,更改将反映在所有行中。这里是我的xaml代码wpf模板组合框中的选择更改列更改其他行中的值

<DataGrid x:Name="dtg" 
       Grid.Row="2" 
       AutoGenerateColumns="False" 
       CanUserAddRows="True" 
       IsReadOnly="False" 
       VerticalScrollBarVisibility="Visible" 
       EnableRowVirtualization="False" 
       SelectionUnit="CellOrRowHeader" 
       SelectionMode="Extended" 
       ItemsSource="{Binding MainDataCollection, Mode= TwoWay}" 
       AlternatingRowBackground="{DynamicResource AccentColorBrush2 }" 
       GridLinesVisibility="Horizontal" 
       KeyUp="Dtg_OnKeyUp" > 
     <DataGrid.Columns> 
      <DataGridTextColumn x:Name="slnoColunColumn" 
           Header="slno." 
           IsReadOnly="True" 
           Width="75" 
           Binding="{Binding Mode=OneWay , Path = Slno}"></DataGridTextColumn> 

      <DataGridTemplateColumn Header="Category" Width="*" x:Name="categoryColumn"> 


       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox x:Name="categoryBox" 
          IsEditable="True" 
          controls:TextBoxHelper.ClearTextButton="True" 
          controls:TextBoxHelper.SelectAllOnFocus="True" 
          controls:TextBoxHelper.Watermark="Category" 
          MaxDropDownHeight="125" 
          SelectionChanged="CategoryBox_OnSelectionChanged" 
          DisplayMemberPath="CategoryName" 
          SelectedValuePath="CategoryId" 
          ItemsSource="{Binding Path=DataContext.CategoriesCollection, 
          RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

      <DataGridTemplateColumn Header="Question" Width="*" x:Name="questionColumn"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox x:Name="questionBox" 
          IsEditable="True" 
          controls:TextBoxHelper.ClearTextButton="True" 
          controls:TextBoxHelper.SelectAllOnFocus="True" 
          controls:TextBoxHelper.Watermark="Question" 
          MaxDropDownHeight="125" 
          DisplayMemberPath="TheQuestion" 
          SelectedValuePath="QuestionID" 
          ItemsSource="{Binding Path = DataContext.QuestionsCollection, 
          RelativeSource = {RelativeSource FindAncestor, AncestorType = DataGrid}}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

      <DataGridTemplateColumn Header="Answer" Width="*" x:Name="AnswerColumn"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox x:Name="answerBox" 
          IsEditable="True" 
          controls:TextBoxHelper.ClearTextButton="True" 
          controls:TextBoxHelper.SelectAllOnFocus="True" 
          controls:TextBoxHelper.Watermark="Answer" 
          MaxDropDownHeight="125" 
          DisplayMemberPath="TheAnswer" 
          SelectedValuePath="AnswerID" 
          ItemsSource="{Binding Path = DataContext.AnswersCollection, 
          RelativeSource = {RelativeSource FindAncestor, AncestorType= DataGrid}}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

     </DataGrid.Columns> 
    </DataGrid> 

有人知道为什么它的行为是这样的。任何人都可以找到一个解决方案来解决这个

方法添加数据

public void AddData() 
    { 
     if (MainDataCollection== null) MainDataCollection = new ObservableCollection<GridDataSource>(); 
     if (CategoriesCollection == null) CategoriesCollection = new ObservableCollection<Category>(); 
     if(QuestionsCollection == null) QuestionsCollection = new ObservableCollection<Question>(); 
     if(AnswersCollection == null) AnswersCollection = new ObservableCollection<Answer>(); 

     AddDataGridRow(0); 
     var data = _dataProvider.GetCategoriesTable(0); 

     foreach (DataRow row in data.Rows) 
     { 

       CategoriesCollection.Add(new Category(int.Parse(row[0].ToString()),row[1].ToString())); 
     } 

    } 

方法来添加新的数据网格行

public void AddDataGridRow(int slno) 
    { 
     MainDataCollection.Add(new GridDataSource(slno+1,"","","")); 
    } 

方法得到的问题

public void GetQuestions(int categoryId) 
    { 
     if (QuestionsCollection == null)QuestionsCollection = new ObservableCollection<Question>(); 
     QuestionsCollection.Clear(); 
     var data = _dataProvider.GetQuestionsTable(categoryId); 
     foreach (DataRow row in data.Rows) 
     { 
      QuestionsCollection.Add(new Question(int.Parse(row[0].ToString()),row[1].ToString())); 
     } 

     GetAnswers(categoryId);    
    } 

方法获得答案

public void GetAnswers(int categoryId) 
    { 
     if (AnswersCollection == null) AnswersCollection = new ObservableCollection<Answer>(); 
     AnswersCollection.Clear(); 
     var data = _dataProvider.GetAnswersTable(categoryId); 
     foreach (DataRow row in data.Rows) 
     { 
      AnswersCollection.Add(new Answer(int.Parse(row[0].ToString()), row[1].ToString())); 
     } 

    } 

组合框中选择改变

private void CategoryBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     ComboBox cb = sender as ComboBox; 
     _mainWindowViewModel.GetQuestions((int)cb.SelectedValue);    
    } 

尝试增加这所有3个组合框:

IsSynchronizedWithCurrentItem="False"

我猜这已经解决了这个网站:)

+0

前它不起作用 – Sony

+0

你能发表一些ViewModel代码吗? – slimbofat

+0

代码来填充这些组合框? – Sony