2016-06-24 12 views
0

Ich weiß, dass es ähnliche Fragen gibt, aber ich bekomme das falsch.Richtiges Setzen meines DataContext in XAML

ich habe:

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

Futher nach unten in meinem Markup habe ich eine DataGrid:

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

Aber ich glaube nicht, dass es mehr richtig ist. Mein OCLMEditorModel-Objekt verfügt über eine öffentliche Eigenschaft namens StudentList. Wenn ich dieses Recht verstehe, ist mein Fenster im Moment mit einer Instanz von OCLMEditorModel verknüpft. Das nachfolgende DataGrid ist jedoch mit einer distinkten Instanz der CollectionViewSource verknüpft.

So bin ich verwirrt mich. Danke für die Führung.

Antwort

2

Der Versuch,

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

bis

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

Sie haben richtig, dass Ihr DataContext anfänglich auf eine Instanz von OCLMEditorModel festgelegt wird, wenn das Fenster instanziiert wird. Das sollte bedeuten, dass Ihre CollectionViewSource-Ressource die StudentList-Eigenschaft von dem DataContext des Windows durch eine direkte Bindung abrufen kann.

Ja, was Sie in Ihrem XAML tun, bindet die ItemsSource Ihres DataGrids an eine bestimmte Instanz der CollectionViewSource. jedoch, Sie auch, dass CollectionViewSource Instanz zu einer deutliche Instanz eines in Ihrem Window.Resources (<local:StudentList x:Key="StudentList" /> ) definiert StudentList Bindung, die ich glaube nicht, ist das, was Sie wollen. Die Änderung, die ich oben vorgeschlagen habe, wird Ihre CollectionViewSource an die StudentList-Eigenschaft OCLMEditorModel stattdessen binden.

+0

Danke. Ich werde das versuchen und zu dir zurückkommen. –

+0

Wenn ich dies tue, sagt es mir, dass StudentList in der WPF nicht unterstützt wird. –

+0

Ich hatte Binding Wort vergessen. Aber jetzt zeigt mein Raster keine Daten. –

1

Warum nicht Sie binden nur an die StudentList Eigenschaft, wie

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

Er wahrscheinlich eine Collection verwenden, weil er sortieren will. Direkte Bindung an die Eigenschaft wird nicht tun – Rowbear

+0

@Rowbear Ich benutze die CVS wegen der Filterung. –

0

Sie DataContext auf die folgende Art und Weise einstellen ...

<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"> 
+0

Danke. Aber was ist mit den CVS? Wir benötigen diese an die OCLMEditor Student-Listeneigenschaft gebunden. Müsste das nicht auch geändert werden? –

1

Sie direkt Ihre Collection im Ansichtsmodell definieren und binden Collection zu 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}" ... /> 
+0

Danke. Ich habe es basierend auf der anderen Antwort funktioniert.Ich glaube, dass Sie in Code im Gegensatz zu in XAML. Aber beide enden mit dem gleichen Ergebnis. –

+0

Als Randnotiz habe ich meine Klasse 'OCLMEditorModel' aufgerufen, aber es hört sich so an, als hätte ich es' OCLMEditorViewModel' nennen sollen? Und meine Quelldatei 'XML' würde als' Model' Objekt betrachtet werden? –

+0

Hinweis: Sie haben Ihre collectionviewsource in xaml und deren Filter in code hinter in xaml.cs definiert, was eine Verletzung von mvvm darstellt. –

Verwandte Themen