在 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}" ... />
我知道有类似的问题,但我弄错了。
我有:
<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}" ... />