2012-02-04 47 views
1

これらのObservableCollectionを両方ともxamlに実装するにはどうすればよいですか?私はすべての生徒とリストビューを持ちたいと思います。そして、私の先生すべてと一緒にリストビューを作成したいと思います。今はサンプルの生徒と教師のオブジェクトを作成しました。私はこれについて間違った方法をとっていますか?最終的に私はデータテーブルから引き出しますが、どのように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

あなたは2つのコレクションにあなたのViewModelのパブリックメンバを行う必要があります。次に、XAMLで、DataContextをViewModelに設定し、リストボックスをバインドされたモデルの関連するパブリックメンバーにバインドします。

更新:ここでは簡単なうまくいけば、完全な例

である私は学生のクラスを定義し、INotifyPropertyChangedの非常に単純な実装を実証していないことを、機種コードです。私は先生のコレクションのためにStudentクラスを再利用しましたので、混乱の原因にならないことを願っています。

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の場合は、ウィンドウを使用しただけですが、ページも同様です。グリッドコンテナを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

Uは2つの別個のコレクションプロパティを作成するのと同じですか?どのような方法でも私に例を挙げることができますか? :) – TMan

+0

@Tman、正しい。私は例をまとめてここに掲示します、私は通常C#を使用していますので、VB.NET翻訳に最善を尽くします。 –

+0

よろしくお願いします。 – TMan

関連する問題