我有一个带有以下构造函数的WPF窗口ViewAssignedStudentsWindow
:
public ViewAssignedStudentsWindow(IEnumerable<StudentDTO> allStudents, MandatoryLessonDTO lesson)
{
InitializeComponent();
studentsGrid.ItemsSource = allStudents;
studentsGrid.SelectedItems.Add(allStudents.Where(x => lesson.StudentIds.Contains(x.Id)));
}
StudentDTO
包含属性FirstName
,LastName
,Id
以及其他一些属性,这对此问题不重要。 StudentIds
班级中的MandatoryLessonDTO
属性是IEnumerable<Guid>
,其中包含一些学生的ID。 ViewAssignedStudentWindow
的xaml:
<DataGrid SelectionMode="Extended" IsReadOnly="true" HeadersVisibility="Column" ItemsSource="{Binding}" ColumnWidth="*" DockPanel.Dock="Top" Background="White" AutoGenerateColumns="false" x:Name="studentsGrid">
<DataGrid.Columns>
<DataGridTextColumn Header="First name" Binding="{Binding FirstName}" />
<DataGridTextColumn Header="Last name" Binding="{Binding LastName}" />
</DataGrid.Columns>
</DataGrid>
问题是网格充满了学生的数据,但SelectedItems
似乎不起作用 - 没有选择任何项目。如果我尝试调试代码,LINQ似乎会产生正确的结果,但SelectedItems
保持为空。我完全迷失在这一点为什么这不起作用,这似乎是一个如此简单的任务。任何帮助将不胜感激。
答案 0 :(得分:0)
我会在这里向Items项目推荐DataBinding
。
你的学生班:
public class Students : INotifyPropertyChanged {
private bool _selected;
public bool Selected {
get { return _selected; }
set {
if (value == _selected) return;
_selected = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
向您的DG添加RowStyle
:
<DataGrid ... >
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="IsSelected" Value="{Binding Selected}" />
</Style>
</DataGrid.RowStyle>
</DataGrid>
从CodeBehind中选择行:
public ViewAssignedStudentsWindow(IEnumerable<StudentDTO> allStudents, MandatoryLessonDTO lesson)
{
InitializeComponent();
studentsGrid.ItemsSource = allStudents;
allStudents.ForEach(x => x.Selected = lesson.StudentIds.Contains(x.Id)));
}