2012-02-04 90 views
1

如何在我的xaml中實現這兩個ObservableCollections?我想和所有的學生一起進行一個列表視圖,以及與我所有的老師的另一個列表視圖。現在我只是做了一個學生和老師的例子。我是否以錯誤的方式去做這件事。最終我會從數據表中拉出來,不知道如何將它實現到ObservableCollection。如何綁定XAML中的多個ObservableCollection

 Public Class PersonalViewModel 


Public Sub New() 

    Dim obcollection1 As New ObservableCollection(Of Student) 
    Dim obcollection2 As New ObservableCollection(Of Teacher) 

    obcollection1.Add(New Student("W0332309", "Tony", "Thetiger", "Male")) 

    obcollection2.Add(New Teacher) 

    'I Cant set datacontext here cause 1.) this isn't a window 2.) I can only set datacontext once anyway 
    'So how to do it in xaml? 


End Sub 

End Class 

XAML:

<Page.Resources> 
    <local:PersonalViewModel x:Key="personalviewmodel"></local:PersonalViewModel> 

</Page.Resources> 

    <ListView ItemsSource="{Binding Source= {StaticResource personalviewmodel}}" HorizontalAlignment="Left" Margin="256,42,0,67" Name="ListView1" Width="166" IsSynchronizedWithCurrentItem="True" > 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FName}" /> 
        <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LName}" /> 
       </GridView> 

      </ListView.View> 
     </ListView> 

回答

4

你應該把兩個集合的視圖模型的公共成員。然後在XAML中,將DataContext設置爲ViewModel,並將列表框綁定到綁定模型中的相關公共成員。

更新:這是一個簡單的,但希望完整的例子

這裏是示範代碼,而不是我只定義一個學生類,並表現出了非常幼稚的實施INotifyPropertyChanged的的。我重複使用學生班的教師收藏,所以我希望不會造成混淆。

Imports System.ComponentModel 
Imports System.Collections.ObjectModel 

Public Class PersonalViewModel 
    Private _students As New ObservableCollection(Of Student) 
    Public ReadOnly Property Students As ObservableCollection(Of Student) 
    Get 
     Return _students 
    End Get 
    End Property 

    Private _teachers As New ObservableCollection(Of Student) 
    Public ReadOnly Property Teachers As ObservableCollection(Of Student) ' This should be a Teacher class 
    Get 
     Return _teachers 
    End Get 
    End Property 

    Public Sub New() 
    _students.Add(New Student("Tony", "Thetiger")) 
    _teachers.Add(New Student("Cindy", "Thecougar")) 
    End Sub 
End Class 

Public Class Student 
    Implements INotifyPropertyChanged 

    Private _firstName As String 
    Private _lastName As String 

    Public Sub New(firstName As String, lastName As String) 
    Me.FirstName = firstName 
    Me.LastName = lastName 
    End Sub 

    Public Property FirstName As String 
    Get 
     Return _firstName 
    End Get 
    Set(value As String) 
     If value <> _firstName Then 
     _firstName = value 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("FirstName")) 
     End If 
    End Set 
    End Property 

    Public Property LastName As String 
    Get 
     Return _lastName 
    End Get 
    Set(value As String) 
     If value <> _lastName Then 
     _lastName = value 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("LastName")) 
     End If 
    End Set 
    End Property 

    Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged 
End Class 

對於XAML,我剛剛使用了一個窗口,但同樣適用於Page。請注意,我將網格容器綁定到Model,然後將每個ListView綁定到相應的集合。

<Window x:Class="MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:ModelBindDemo" 
    Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
    <local:PersonalViewModel x:Key="model" /> 
    </Window.Resources> 
    <Grid DataContext="{Binding Source={StaticResource model}}"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <ListView Grid.Column="0" ItemsSource="{Binding Students}"> 
     <ListView.View> 
     <GridView> 
      <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName}" /> 
      <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName}" /> 
     </GridView> 
     </ListView.View>  
    </ListView> 

    <ListView Grid.Column="1" ItemsSource="{Binding Teachers}"> 
     <ListView.View> 
     <GridView> 
      <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName}" /> 
      <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName}" /> 
     </GridView> 
     </ListView.View> 
    </ListView> 
    </Grid> 
</Window> 
+0

ü意味着像創建兩個單獨的集合屬性?任何可能的方式你能給我一個例子嗎? :) – TMan 2012-02-04 06:19:35

+0

@TMan,正確。我將整理一個示例並將其發佈到此處,我通常使用C#,因此我將盡最大努力進行VB.NET翻譯。 – 2012-02-04 06:28:20

+0

好的非常感謝 – TMan 2012-02-04 06:29:44