2017-09-27 115 views
0

バインディングに基づいて選択したアイテムを青色で表示するようにリストビューを設定しようとしていますが、データトリガーは起動しません。トリガー値を0(初期値)に設定すると、listviewitemsは青色の背景で作成されますが、その後は変更されません。Wpf DataTriggerがプロパティの変更で起動しない

VBコード:

Private Sub SetGridViewDynamically() 
    Dim myGridView As New GridView 
    myGridView.AllowsColumnReorder = True 

    Dim gvc1 As New GridViewColumn 
    gvc1.DisplayMemberBinding = New Binding("A") 
    gvc1.Header = "1" 
    gvc1.Width = TestListView.ActualWidth * 0.19 
    myGridView.Columns.Add(gvc1) 

    Dim gvc2 As New GridViewColumn 
    gvc2.DisplayMemberBinding = New Binding("B") 
    gvc2.Header = "2" 
    gvc2.Width = TestListView.ActualWidth * 0.39 
    myGridView.Columns.Add(gvc2) 

    Dim gvc3 As New GridViewColumn() 
    gvc3.DisplayMemberBinding = New Binding("C") 
    gvc3.Header = "3" 
    gvc3.Width = TestListView.ActualWidth * 0.19 
    myGridView.Columns.Add(gvc3) 

    Dim gvc4 As New GridViewColumn() 
    gvc4.DisplayMemberBinding = New Binding("D") 
    gvc4.Header = "4" 
    gvc4.Width = TestListView.ActualWidth * 0.19 
    myGridView.Columns.Add(gvc4) 

    TestListView.View = myGridView 

    Dim style As New Style 
    style.TargetType = GetType(ListViewItem) 
    style.Setters.Add(New Setter(ListViewItem.HorizontalContentAlignmentProperty, HorizontalAlignment.Center)) 
    Dim x = New DataTrigger 
    x.Binding = New Binding("rowselected") 
    x.Value = 0 
    x.Setters.Add(New Setter(TestListView.BackgroundProperty, DarkGradientSample.Background)) 

    Dim x2 = New Trigger 
    x2.Property = ItemsControl.AlternationIndexProperty 
    x2.Value = 1 
    x2.Setters.Add(New Setter(TestListView.BackgroundProperty, LightGradientSample.Background)) 

    Dim x3 As New DataTrigger 
    x3.Binding = New Binding("rowselected") 
    x3.Value = 1 
    x3.Setters.Add(New Setter(TestListView.BackgroundProperty, BlueGradientSample.Background)) 

    style.Triggers.Add(x) 
    style.Triggers.Add(x2) 
    style.Triggers.Add(x3) 

    TestListView.ItemContainerStyle = style 

End Sub 

、問題のリストビューのためのXAML:

<ListView x:Name="TestListView" Grid.Column="1" Margin="10" Grid.Row="2" ItemsSource="{Binding picks}" FontSize="48" AlternationCount="2" Foreground="White" HorizontalContentAlignment="Stretch"> 

    </ListView> 

編集:手に入れました。私はInotifypropertychangedを正しく実装していませんでした。ここではクラスで適切に実装インタフェース

Public Class PickLocation 
    Implements INotifyPropertyChanged 
    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 
    Private _rowselected As Integer 
    Public Property rowselected As Integer 
     Get 
      Return _rowselected 
     End Get 
     Set(value As Integer) 
      _rowselected = value 
      RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("rowselected")) 
     End Set 
    End Property 
+0

はrowselectedが定義されているクラスをいINotifyPropertyChangedを実装しますか? – mm8

+0

ああ、インタフェースを実装していませんでした。私は今ですが、私はまだそれを発射していません。 投稿を編集してクラスを表示しました – MWFBrad

+1

あなたはそのプロパティの設定者でイベントを起こしていません。 – mm8

答えて

1

だあなたのクラスはINotifyPropertyChangedを実装し、プロパティを新しい値に設定されるたびにPropertyChangedイベントを発生させる必要があります。

Public Class PickLocation 
    Implements INotifyPropertyChanged 

    Public Event PropertyChanged As PropertyChangedEventHandler _ 
     Implements INotifyPropertyChanged.PropertyChanged 

    Private Sub NotifyPropertyChanged(<CallerMemberName()> Optional ByVal propertyName As String = Nothing) 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName)) 
    End Sub 


    Private _rowselected As Integer 
    Public Property rowselected() As Integer 
     Get 
      Return _rowselected 
     End Get 

     Set(ByVal value As Integer) 
      If Not(value = _rowselected) Then 
       _rowselected = value 
       NotifyPropertyChanged() 
      End If 
     End Set 
    End Property 
End Class 
関連する問題