2017-08-17 13 views
0

私はWPF/MVVMを使い慣れていて、観察可能なコレクションクラスをリストビューにバインドしようとしています。ObservableCollectionをDatabindでMVVMのListViewにしようとしています

XAML:

<Window.DataContext> 
    <local:acLengthCalcVM/> 
</Window.DataContext> 

<StackPanel> 
    <GroupBox Header="Section(s) Selected" Margin="3,10,3,10"> 
     <ListView x:Name="lvSections" Margin="0,6,0,2" Height="150" ItemsSource="{Binding SectionsSelected}"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="#" Width="30"/> 
        <GridViewColumn Header="Reference Tag #" Width="100"/> 
        <GridViewColumn Header="Section Type" Width="150"/> 
        <GridViewColumn Header="Section Length" Width="100"/> 
       </GridView> 
      </ListView.View> 
     </ListView> 
    </GroupBox> 
</StackPanel> 

ビューモデル:

Public Class acLengthCalcVM 
Implements INotifyPropertyChanged 
Dim _sectionsSelected As ObservableCollection(Of acLengthCalcModel) = New ObservableCollection(Of acLengthCalcModel) 
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 


Public Property SectionsSelected As ObservableCollection(Of acLengthCalcModel) 
    Get 
     Return _sectionsSelected 
    End Get 
    Set(value As ObservableCollection(Of acLengthCalcModel)) 
     _sectionsSelected = value 
     NotifyPropertyChanged("SectionsSelected") 
    End Set 
End Property 


Private Sub NotifyPropertyChanged(Optional propertyName As String = "") 
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName)) 
End Sub 

エンドクラス

モデル:

Public Class acLengthCalcModel 
Inherits ObservableCollection(Of acLengthCalcData) 
Public Sub New() 
    Add(New acLengthCalcData(1, "n/a", "VTU Frame", 8)) 
    Add(New acLengthCalcData(2, "1.1.01", "Air Conveyor Straight", 118)) 
End Sub 

エンドクラス

Public Class acLengthCalcData 
' Constructor for this Class 
Public Sub New(serialNum As Integer, refTagNum As String, sectionType As String, sectionLength As Double) 
    _refTagNum = refTagNum 
    _sectionLength = sectionLength 
    _sectionType = sectionType 
    _serialNum = serialNum 
End Sub 

' Reference Tag # 
Private _refTagNum As String 
Public Property RefTagNum As String 
    Get 
     Return _refTagNum 
    End Get 
    Set(value As String) 
     _refTagNum = value 
    End Set 
End Property 

' Section Length 
Private _sectionLength As Double 
Public Property SectionLength As Double 
    Get 
     Return _sectionLength 
    End Get 
    Set(value As Double) 
     _sectionLength = value 
    End Set 
End Property 

' Section Type 
Private _sectionType As String 
Public Property SectionType As String 
    Get 
     Return _sectionType 
    End Get 
    Set(value As String) 
     _sectionType = value 
    End Set 
End Property 

' Serial # 
Private _serialNum As Integer 
Public Property SerialNum As Integer 
    Get 
     Return _serialNum 
    End Get 
    Set(value As Integer) 
     _serialNum = value 
    End Set 
End Property 

エンドクラス

私は、コードを実行すると、リストビューにのみ、そのヘッダを使用して作成されて、私はモデルのコンストラクタで初期化されたデータのどれも現れません。

enter image description here

任意のポインタ?ありがとう。

+0

観察可能なコレクションは読み取り専用のプロパティである必要があります。彼らには変更通知があります。 Snoopのようなツールを使用して、実行時にバインドを調べることができます。なぜなら、それらが動作していない理由についてのヒントを与えるかもしれません。 – Will

+0

ありがとうございます。代わりに普通のリストを使用したと思うかもしれませんか?私が表示する必要がある項目は、変更通知を必要としません。単にそれらの見出しの下に一連のアイテムが表示されますか? – mindofcat

+0

ここには複数の問題があります。それ以外の場合は修正します。 (1)空セクション選択コレクションを作成しました。したがって、リストは空でなければなりません。 (2)ListViewはコレクションのコレクションにバインドされています...あなたが望むものである可能性はありません。 (3)GridViewColumnにはDisplayMemberBindingなどが必要です。だからもう少し近づけて、あなたのためにそれを修正します。 – AQuirky

答えて

1

あなたはあなたのビューモデルクラスでacLengthCalcModelのインスタンスを作成して返す必要があります:

Public Class acLengthCalcVM 
    Implements INotifyPropertyChanged 
    Dim _sectionsSelected = New acLengthCalcModel 
    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 


    Public Property SectionsSelected As acLengthCalcModel 
     Get 
      Return _sectionsSelected 
     End Get 
     Set(value As acLengthCalcModel) 
      _sectionsSelected = value 
      NotifyPropertyChanged("SectionsSelected") 
     End Set 
    End Property 


    Private Sub NotifyPropertyChanged(Optional propertyName As String = "") 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName)) 
    End Sub 
End Class 

ます。またDisplayMemberBindingプロパティを使用してacLengthCalcDataクラスのプロパティに各列をバインドする必要があります。

<ListView x:Name="lvSections" Margin="0,6,0,2" Height="150" ItemsSource="{Binding SectionsSelected}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="#" DisplayMemberBinding="{Binding SerialNum}" Width="30"/> 
      <GridViewColumn Header="Reference Tag #" DisplayMemberBinding="{Binding RefTagNum}" Width="100"/> 
      <GridViewColumn Header="Section Type" DisplayMemberBinding="{Binding SectionType}" Width="150"/> 
      <GridViewColumn Header="Section Length" DisplayMemberBinding="{Binding SectionLength}" Width="100"/> 
     </GridView> 
    </ListView.View> 
</ListView> 
+0

まさに私が探していたもの!私のビューモデルクラスでacLengthCalcModelのインスタンスを作成して返します。 XAMLのGridViewColumnsにDisplayMemberBindingを実装しています。プルフェクト! – mindofcat

関連する問題