0

I'm trying to set up a listview to show the selected Items in blue, based on a binding, but the datatrigger won't fire. If I set the trigger value to 0 (initial value), the listviewitems create with the blue background, but won't change afterward.

VB code:

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

and the XAML for the listview in question:

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

    </ListView>

Edit: Got it. I wasn't implementing Inotifypropertychanged properly. here's the interface properly implemented in the class

 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
MWFBrad
  • 30
  • 6

1 Answers1

1

Your class should implement the INotifyPropertyChanged and raise the PropertyChanged event whenever the property is set to a new value:

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
mm8
  • 163,881
  • 10
  • 57
  • 88