在XAML中正确设置我的DataContext

时间:2016-06-24 18:16:04

标签: c# wpf xaml datacontext

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

我有:

<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的公共属性。如果我理解这一点,那么目前我的窗口与OCLMEditorModel的实例相关联。但随后的DataGrid与CollectionViewSource的 distinct 实例相关联。

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

4 个答案:

答案 0 :(得分:2)

尝试更改

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

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

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

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

答案 1 :(得分:1)

为什么不要绑定到StudentList属性,例如

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

答案 2 :(得分:1)

您可以在viewmodel中直接定义collectionviewsource,并将collectionviewsource绑定到DataGrid ItemSource

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}" ... />

答案 3 :(得分:0)

您可以按以下方式设置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">