1

Studentテーブル、Courseテーブル、StudentCourseテーブルがあります。私のWPFでは、コンボボックスを使用して「学生」を選択しています。ObservableCollectionを使用して、対応するコースとそのプロパティ(CourseID、CourseName、Credit)をリストビューに表示するにはどうすればよいですか?これがコンボボックスSelectionChangedイベントの私のコードです

 private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        int MySelect = (int)this.comboBox1.SelectedValue;
        var SelectedStudent = db.Students.Include("StudentCourses.Course").SingleOrDefault(f => f.StudentID == MySelect);
4

1 に答える 1

3

まだ行っていない場合は、MVVMスタイルのアプローチを使用することを強くお勧めします。ListViewのItemsSourceはViewModelのObservableCollectionにバインドされている必要があり、ComboBoxのSelectedItemもViewModelのプロパティにバインドされている必要があります。SelectedItemが変更され、プロパティのセッターが呼び出されると、ListViewがバインドされているObservableCollectionが更新されます。

アップデート:

部分的に実装されたソリューションは次のとおりです。

XAML:

<DockPanel>
    <ComboBox ItemsSource="{Binding Students}" SelectedItem="{Binding SelectedComboItem}" DockPanel.Dock="Top">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

    <ListView ItemsSource="{Binding StudentCourses}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Name, StringFormat={}Name: {0}}"/>
                    <TextBlock Text="{Binding Id, StringFormat={}Id: {0}}"/>
                    <TextBlock Text="{Binding Credit, StringFormat={}Credit: {0}}"/>
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</DockPanel>

コード:

public class Student
{
    public string Name { get; set; }
    public List<string> CourseIds { get; set; }
} 


public class Course
{
    public string Name { get; set; }
    public string Id { get; set; }
    public int Credit { get; set; }
}


public class ViewModel : INotifyPropertyChanged
{
    public ObservableCollection<Course> StudentCourses { get; set; }
    public ObservableCollection<Student> Students { get; set; }


    public Student SelectedComboItem
    {
        get { return selectedComboItem_; }
        set {
            selectedComboItem_ = value;
            StudentCourses.Clear();
            foreach(Course course in courses_)
                if(selectedComboItem_.CourseIds.Contains(course.Id))
                    StudentCourses.Add(course);
            PropertyChanged(this, new PropertyChangedEventArgs("SelectedComboItem"))    ;
        }
    }


    private List<Course> courses_ = new List<Course>();
    private Student selectedComboItem_;


    ... // Read DB and build collections

    public event PropertyChangedEventHandler PropertyChanged;
}
于 2012-04-17T17:43:48.350 に答える