Gop*_*opi 7 c# wpf wpfdatagrid datagridcomboboxcolumn
这里提出类似于我的问题的问题,但我没有在那里找到解决方案.
我的问题:如何将不同数据(比如Lists)绑定到不同行中每个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; }
}
当我运行此代码时,输出如下.
正如你们在我的代码中看到的那样,不同的班级有不同的教师.当我点击说第9课时,
应将"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;
            }
       }
我尝试了注释部分和未注释部分,但没有用.当我运行我的应用程序时,它显示如上面的第一个图表.但是当点击特定行时,所有其他行数据都在消失.但问题是,它正在更新新的教师数据.看下面的两张照片.
因此,如果不更改其他行,我可以更新我想要的行.....
我可以想到几种方法来做到这一点。
如果您不关心严格的 MVVM 设计,您可以使用 a 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;
        ...
    }
}
如果您想让它动态化并避免在转换器中硬编码列表引用,您可以使用 anIMultiValueConverter并将变量数组作为另一个绑定值传递给它,并调整代码以简单地从从其他绑定值传入的数组中找到正确的 ItemsSource 。
请注意,要使用其中任何一个,您可能必须从 a 切换DataGridComboBoxColumn到 a DataGridTemplateColumn,因为绑定在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; }
}
您还需要一个更改事件,以便每当 CLASS 更改时,ValidTeachers数组都会更新。
我确信还有其他可能更干净的选择,但如果您正在寻找简单易用的东西,我会推荐其中之一。