在 XAML 中正确设置我的 DataContext

Correctly setting my DataContext in XAML

我知道有类似的问题,但我弄错了。

我有:

<Window.Resources>
    <local:StudentList x:Key="StudentList" />
    <local:InverseBooleanConverter x:Key="InverseBooleanConverter" />
    <local:StudentAssignmentToStudentAssignmentLookup x:Key="LookupHistoryConvertor" />
    <CollectionViewSource x:Key="cvsStudentList" Source="{StaticResource StudentList}" Filter="CollectionViewSource_Filter"/>

</Window.Resources>

<Window.DataContext>
    <local:OCLMEditorModel/>
</Window.DataContext>

在我的标记中,我有一个 DataGrid

<DataGrid Name="gridStudents" ItemsSource="{Binding Source={StaticResource cvsStudentList}}"
          Margin="2"
          Height="250"
          AutoGenerateColumns="False" IsReadOnly="True">

但我觉得现在不对了。我的 OCLMEditorModel 对象有一个名为 StudentList 的 public 属性。如果我没有理解错的话,目前我的 window 与 OCLMEditorModel 的一个实例相关联。但是随后的 DataGrid 与 CollectionViewSource 的 distinct 实例相关联。

所以我让自己感到困惑。感谢指导。

你为什么不直接绑定到StudentList 属性,比如

<DataGrid Name="gridStudents" ItemsSource="{Binding StudentList}" ... />

您可以通过以下方式设置DataContext...

 <Window.Resources>
            <local:OCLMEditorModel x:Key="MyViewModel"/>
        </Window.Resources>
    <DataGrid DataContext="{StaticResource MyViewModel}" Name="gridStudents" ItemsSource="{Binding Source={StaticResource cvsStudentList}}"
              Margin="2"
              Height="250"
              AutoGenerateColumns="False" IsReadOnly="True">

正在尝试改变您的

<CollectionViewSource x:Key="cvsStudentList" Source="{StaticResource StudentList}" Filter="CollectionViewSource_Filter"/>

<CollectionViewSource x:Key="cvsStudentList" Source="{Binding StudentList}" Filter="CollectionViewSource_Filter"/>

您是正确的,当实例化 window 时,您的 DataContext 最初设置为 OCLMEditorModel 的实例。这应该意味着您的 CollectionViewSource 资源应该能够通过直接绑定从 Window 的 DataContext 中获取 StudentList 属性。

是的,您在 xaml 中所做的是将 DataGrid 的 ItemsSource 绑定到 CollectionViewSource 的不同实例。 但是,您还将那个 CollectionViewSource 实例绑定到 distinct 实例 StudentList 在您的 Window.Resources ( <local:StudentList x:Key="StudentList" /> ),我认为这不是你想要的。我上面建议的更改将使您的 CollectionViewSource 绑定到 OCLMEditorModel 的 StudentList 属性。

您直接在视图模型中定义您的 collectionviewsource 并将 collectionviewsource 绑定到 DataGrid ItemSsource

public class StudentViewModel
{
    public ObservableCollection<student> StudentList { get; set; }

    public ICollectionView StudentView { get; set; }

    public StudentViewModel()
    {
        StudentList= new ObservableCollection<student>();
        StudentView = new CollectionView(StudentList);
        StudentView.Filter = Filter;
        StudentView.SortDescriptions.Add(new SortDescription("Name",ListSortDirection.Ascending));
    }

    private bool Filter(object obj)
    {
        return true;
    }
}

<DataGrid Name="gridStudents" ItemsSource="{Binding StudentView}" ... />