- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
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; }
}
当我运行这段代码时,输出如下。
正如你们在我的代码中看到的那样,不同的类(class)有不同的老师。当我点击说第 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 设计,您可以使用 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/
在我的 android 应用程序中,我想在同一行中实现 2 个文本字段。如果文本太长可以转到下一行。所以我使用了更精简的水平布局并添加了 2 个文本字段。 [例如:TextView1、TextV
由于node使用了javascript,它可以充当webrtc peer吗? 然后我可以将它编码为 VP8 流并广播给所有其他对等方吗? 最佳答案 WebRTC 是一个浏览器 API 而不是 Java
我是一名优秀的程序员,十分优秀!