gpt4 book ai didi

c# - DataGridComboBoxColumn 不同行的不同 ItemsSource

转载 作者:太空狗 更新时间:2023-10-29 20:26:55 25 4
gpt4 key购买 nike

Here问了与我的问题类似的问题,但我没有在那里找到解决方案。

我的问题:如何将不同的数据(比如列表)绑定(bind)到不同行中每个 ComboBox 的“DataGridComboBoxColumn”。这是我试过的代码

XAML:

<Grid>
<DataGrid x:Name="dg_TimeTable" AutoGenerateColumns="False" Margin="0,0,0,97" ColumnWidth="*">
<DataGrid.Columns>
<DataGridTextColumn IsReadOnly="True" Binding="{Binding CLASS}" Header="CLASS" />

<DataGridComboBoxColumn Header="PERIOD" x:Name="gPeriods" SelectedValueBinding="{Binding PERIOD, Mode=TwoWay}" DisplayMemberPath="{Binding PERIOD}" />

<DataGridComboBoxColumn Header="TEACHERS" x:Name="gTeachers" SelectedValueBinding="{Binding TEACHER, Mode=TwoWay}" DisplayMemberPath="{Binding TEACHER}" />

<DataGridComboBoxColumn Header="SUBJECTS" x:Name="gSubjects" SelectedValueBinding="{Binding SUBJECT, Mode=TwoWay}" DisplayMemberPath="{Binding SUBJECT}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>

.cs

using System.Collections.ObjectModel; // For ObservableCollection

public partial class MainWindow : Window
{
ObservableCollection<string> listTeachersSix = null;
ObservableCollection<string> listTeachersSeven = null;
ObservableCollection<string> listTeachersEight = null;
ObservableCollection<string> listTeachersNine = null;
ObservableCollection<string> listTeachersTen = null;
ObservableCollection<string> listSubjects = null;
ObservableCollection<int> listPeriods = null;

public MainWindow()
{
InitializeComponent();

listTeachersSix = new ObservableCollection<string>();
listTeachersSeven = new ObservableCollection<string>();
listTeachersEight = new ObservableCollection<string>();
listTeachersNine = new ObservableCollection<string>();
listTeachersTen = new ObservableCollection<string>();
listSubjects = new ObservableCollection<string>();
listPeriods = new ObservableCollection<int>();

listTeachersSix.Add("Vijay");
listTeachersSix.Add("Naveen");
listTeachersSix.Add("Gopal");
listTeachersSix.Add("Somesh");

listTeachersSeven.Add("Raj");
listTeachersSeven.Add("Rama Krishna");
listTeachersSeven.Add("Rakesh");
listTeachersSeven.Add("Ram Babu");

listTeachersEight.Add("Murali");
listTeachersEight.Add("Ritesh");
listTeachersEight.Add("Nagesh");
listTeachersEight.Add("Tarun");

listTeachersNine.Add("Bhaskar");
listTeachersNine.Add("Babji");
listTeachersNine.Add("Bhanu");
listTeachersNine.Add("Balaji");

listTeachersTen.Add("Lal");
listTeachersTen.Add("Mohan");
listTeachersTen.Add("Raj Sekhar");
listTeachersTen.Add("Sunil");

for (int i = 0; i <= 8; i++)
listPeriods.Add(i);

listSubjects.Add("Maths");
listSubjects.Add("Physics");
listSubjects.Add("Social");
listSubjects.Add("English");
listSubjects.Add("Hindi");
listSubjects.Add("Telugu");


List<Info> listTimeTable = new List<Info>()
{
new Info () { CLASS="6", PERIOD=1, TEACHER="Vijay", SUBJECT="Maths" },
new Info () { CLASS="7", PERIOD=5, TEACHER="Raj", SUBJECT="Physics" },
new Info () { CLASS="8", PERIOD=7, TEACHER="Murali", SUBJECT="Social" },
new Info () { CLASS="10", PERIOD=4, TEACHER="Mohan", SUBJECT="English" },
new Info () { CLASS="6", PERIOD=8, TEACHER="Naveen", SUBJECT="Maths" },
new Info () { CLASS="9", PERIOD=3, TEACHER="Bhaskar", SUBJECT="Hindi" },
new Info () { CLASS="8", PERIOD=6, TEACHER="Ritesh", SUBJECT="English" },
new Info () { CLASS="10", PERIOD=2, TEACHER="Lal", SUBJECT="Social" }
};

dg_TimeTable.ItemsSource = listTimeTable;

gPeriods.ItemsSource = listPeriods;

gSubjects.ItemsSource = listSubjects;

gTeachers.ItemsSource = listTeachersSix;

}
}

public class Info
{
public string CLASS { get; set; }
public int PERIOD { get; set; }
public string SUBJECT { get; set; }
public string TEACHER { get; set; }
}

当我运行这段代码时,输​​出如下。

enter image description here

正如你们在我的代码中看到的那样,不同的类(class)有不同的老师。当我点击说第 9 课时,

enter image description here

"listTeachersNine" 应该添加到 "gTeachers.ItemsSource"。但是如果我这样做了

gTeachers.ItemsSource = listTeachersNine;

所有其他行都有效。我怎样才能在不改变其他行的情况下做到这一点。请给我一些想法...提前致谢

更新:

即使我在下面的代码中尝试过

 private void dg_TimeTable_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
int num = (sender as DataGrid).SelectedIndex;
try
{


if (num == 0)
{
//listTeachersSix.Clear();

//listTeachersSix.Add("Vijay");
//listTeachersSix.Add("Naveen");
//listTeachersSix.Add("Gopal");
//listTeachersSix.Add("Somesh");
gTeachers.ItemsSource = listTeachersSix;

}
else if (num == 1)
{
//listTeachersSix.Clear();

//listTeachersSix.Add("Raj");
//listTeachersSix.Add("Rama Krishna");
//listTeachersSix.Add("Rakesh");
//listTeachersSix.Add("Ram Babu");
gTeachers.ItemsSource = listTeachersSeven;
}
else if (num == 2)
{
//listTeachersSix.Clear();

//listTeachersSix.Add("Murali");
//listTeachersSix.Add("Ritesh");
//listTeachersSix.Add("Nagesh");
//listTeachersSix.Add("Tarun");
gTeachers.ItemsSource = listTeachersEight;

}
}

我尝试了注释部分和未注释部分,但没有用。当我启动我的应用程序时,它显示如上图所示。但是当点击特定行时,所有其他行的数据都消失了。但问题是,它正在更新新的教师数据。请看下面两张图片。

enter image description here

enter image description here

因此,在不更改其他行的情况下,我可以更新我想要的行......

最佳答案

我可以想到几种方法来做到这一点。

如果您不关心严格的 MVVM 设计,您可以使用 IValueConverter,将您的 CLASS 传递给它,并让转换器找出要返回的列表。类似

的东西
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
string key = value as string;
switch (key)
{
case "1":
return SomethingStatic.TeacherList1;
case "2":
return SomethingStatic.TeacherList2;
...
}
}

如果你想让它动态化并避免在你的 Converter 中硬编码列表引用,你可以使用 IMultiValueConverter 并将变量数组作为另一个绑定(bind)值传递给它,并调整代码以简单地找到正确的从其他绑定(bind)值传入的数组中的 ItemsSource。

请注意,要使用其中任何一个,您可能必须从 DataGridComboBoxColumn 切换到 DataGridTemplateColumn,因为绑定(bind)无法从 ComboBoxColumn.

<DataGridTemplateColumn Header="TEACHERS">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding CLASS, Converter={StaticResource TestConverter}}"
SelectedItem="{Binding TEACHER}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

另一种替代解决方案是将 ValidTeachers 列表添加到每个 DataRow 的项目中,在您的例子中是 Info 对象。

public class Info
{
public string CLASS { get; set; }
public int PERIOD { get; set; }
public string SUBJECT { get; set; }
public string TEACHER { get; set; }
public List<string> ValidTeachers { get; set; }
}

您还需要一个 Change Event,这样每当 CLASS 发生变化时,ValidTeachers 数组就会更新。

我敢肯定还有其他选项可能更简洁,但如果您正在寻找简单易用的东西,我会推荐其中之一。

关于c# - DataGridComboBoxColumn 不同行的不同 ItemsSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39395613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com