C#WPF DataGrid以编程方式设置多个选定项目

时间:2016-11-07 19:31:45

标签: c# wpf linq xaml datagrid

我有一个带有以下构造函数的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包含属性FirstNameLastNameId以及其他一些属性,这对此问题不重要。 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保持为空。我完全迷失在这一点为什么这不起作用,这似乎是一个如此简单的任务。任何帮助将不胜感激。

1 个答案:

答案 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)));
}