2016-11-07 6 views
0

私は次のコンストラクタを持つWPFウィンドウViewAssignedStudentsWindowを持っている:C#WPFのDataGrid

public ViewAssignedStudentsWindow(IEnumerable<StudentDTO> allStudents, MandatoryLessonDTO lesson) 
{ 
    InitializeComponent(); 
    studentsGrid.ItemsSource = allStudents; 
    studentsGrid.SelectedItems.Add(allStudents.Where(x => lesson.StudentIds.Contains(x.Id))); 
} 

StudentDTOは、この問題のためには重要ではありませんプロパティFirstNameLastNameIdといくつか他の人を、持っています。 MandatoryLessonDTOクラスのStudentIdsプロパティは、学生のIDの一部を保持するIEnumerable<Guid>です。 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

ここで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> 

ローの選択:

public ViewAssignedStudentsWindow(IEnumerable<StudentDTO> allStudents, MandatoryLessonDTO lesson) 
{ 
    InitializeComponent(); 
    studentsGrid.ItemsSource = allStudents; 
    allStudents.ForEach(x => x.Selected = lesson.StudentIds.Contains(x.Id))); 
}