wpf 模板组合框列中的选择更改更改其他行中的值
selection change in wpf template combo box column changes values in other rows
在我的项目中,我有一个包含三个组合框模板列的数据网格,数据绑定到三个集合,这些列是可编辑的。当我更改任何行中第一列中的选择时,第二个和第三个组合框中的集合是根据第一列中组合框的选定索引选择的,更改会反映在所有行中。这是我的 xaml 代码
<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"
我猜这个网站之前已经解决了:)
在我的项目中,我有一个包含三个组合框模板列的数据网格,数据绑定到三个集合,这些列是可编辑的。当我更改任何行中第一列中的选择时,第二个和第三个组合框中的集合是根据第一列中组合框的选定索引选择的,更改会反映在所有行中。这是我的 xaml 代码
<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"
我猜这个网站之前已经解决了:)