Note that there are some explanatory texts on larger screens.

plurals
  1. PORefresh TreeView CollectionViewSource ObservableCollection Item Changed
    primarykey
    data
    text
    <p>Hello I have the following setup for a treeview:</p> <pre><code>&lt;local:BuddyManager x:Key="bmBuddyManager" /&gt; &lt;CollectionViewSource x:Key="cvsBuddyManager" Source="{Binding Source={StaticResource bmBuddyManager}, Path=Buddies}"&gt; &lt;CollectionViewSource.GroupDescriptions&gt; &lt;PropertyGroupDescription PropertyName="State" /&gt; &lt;/CollectionViewSource.GroupDescriptions&gt; &lt;/CollectionViewSource&gt; &lt;DataTemplate x:Key="dtBuddyTemplate" DataType="{x:Type local:Buddy}"&gt; &lt;StackPanel Orientation="Horizontal"&gt; &lt;TextBlock Text="{Binding Nick}" FontSize="12" FontWeight="Bold" /&gt; &lt;TextBlock Text="{Binding GameHost}" FontSize="12" FontWeight="Bold" Foreground="Purple" Margin="10,0,0,0" /&gt; &lt;/StackPanel&gt; &lt;/DataTemplate&gt; &lt;HierarchicalDataTemplate x:Key="hdtBuddyCategoryTemplate" ItemsSource="{Binding Path=Items}" ItemTemplate="{StaticResource dtBuddyTemplate}"&gt; &lt;TextBlock Text="{Binding Path=Name}" FontWeight="Bold" Foreground="Gold" FontSize="15" /&gt; &lt;/HierarchicalDataTemplate&gt; &lt;TreeView ItemsSource="{Binding Source={StaticResource cvsBuddyManager}, Path=Groups}" ItemTemplate="{StaticResource hdtBuddyCategoryTemplate}" ContextMenuOpening="tvBuddies_ContextMenuOpening" ContextMenuClosing="tvBuddies_ContextMenuClosing" Background="Transparent" Margin="2,0,3,3"&gt; &lt;/TreeView&gt; </code></pre> <p>Code Behind:</p> <pre><code>&lt;System.Runtime.InteropServices.ComVisible(False)&gt; Public Enum BuddyState Online Offline Blocked End Enum &lt;System.Runtime.InteropServices.ComVisible(False)&gt; Public Class Buddy Implements INotifyPropertyChanged Private _Nick As String Private _IsInGame As Boolean Private _GameHost As String Private _State As BuddyState Sub New(ByVal xwisNick As String) _Nick = xwisNick _State = BuddyState.Offline End Sub Sub New(ByVal xwisNick As String, ByVal state As BuddyState) _Nick = xwisNick _State = state End Sub Public Property Nick() As String Get Return _Nick End Get Set(ByVal value As String) _Nick = value End Set End Property Public Property IsInGame() As Boolean Get Return _IsInGame End Get Set(ByVal value As Boolean) _IsInGame = value If _IsInGame = False Then GameHost = Nothing End If OnPropertyChanged("IsInGame") End Set End Property Public Property GameHost() As String Get Return _GameHost End Get Set(ByVal value As String) _GameHost = value OnPropertyChanged("GameHost") End Set End Property Public Property State() As BuddyState Get Return _State End Get Set(ByVal value As BuddyState) _State = value If value = BuddyState.Online Then If _IsInGame Then _IsInGame = False _GameHost = Nothing End If End If OnPropertyChanged("State") End Set End Property Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged ' Create the OnPropertyChanged method to raise the event Protected Sub OnPropertyChanged(ByVal name As String) Try RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name)) Catch End Try End Sub End Class Public Class BuddyManager Implements INotifyPropertyChanged Private ocBuddies As ObservableCollection(Of Buddy) = New ObservableCollection(Of Buddy) Public ReadOnly Property Buddies As ObservableCollection(Of Buddy) Get Return ocBuddies End Get End Property Public BuddyCheck As List(Of Buddy) = New List(Of Buddy) Public IsCheckingForBuddies As Boolean = False Public Function IsBuddy(ByVal XwisNick As String) As Boolean Dim nick As String = XwisNick.ToLower For Each b As Buddy In ocBuddies If b.Nick = nick Then Return True End If Next Return False End Function Public Function IsInGame(ByVal XwisNick As String) As String Dim nick As String = XwisNick.ToLower For Each b As Buddy In ocBuddies If b.Nick = nick Then If b.IsInGame Then Return b.GameHost Else Return Nothing End If End If Next Return Nothing End Function Public Function AddBuddy(ByVal XwisNick As String) As Boolean Dim nick As String = XwisNick.ToLower For Each b As Buddy In ocBuddies If b.Nick = nick Then Return False End If Next ocBuddies.Add(New Buddy(nick)) OnPropertyChanged("Buddies") Return True End Function Public Function RemoveBuddy(ByVal XwisNick As String) As Boolean Dim nick As String = XwisNick.ToLower For i As Integer = 0 To ocBuddies.Count - 1 If ocBuddies(i).Nick = nick Then ocBuddies.RemoveAt(i) OnPropertyChanged("Buddies") Return True End If Next Return False End Function Public Function BlockBuddy(ByVal XwisNick As String) As Boolean Dim nick As String = XwisNick.ToLower For i As Integer = 0 To ocBuddies.Count - 1 If ocBuddies(i).Nick = nick Then ocBuddies(i).State = BuddyState.Blocked OnPropertyChanged("Buddies") Return True End If Next ocBuddies.Add(New Buddy(nick, BuddyState.Blocked)) OnPropertyChanged("Buddies") Return True End Function Public Function UnblockBuddy(ByVal XwisNick As String) As Boolean Dim nick As String = XwisNick.ToLower For i As Integer = 0 To ocBuddies.Count - 1 If ocBuddies(i).Nick = nick Then ocBuddies(i).State = BuddyState.Offline OnPropertyChanged("Buddies") Return True End If Next Return False End Function Public Sub UpdateOnlineStatus(ByVal XwisNick As String, ByVal online As Boolean) Dim nick As String = XwisNick.ToLower For i As Integer = 0 To ocBuddies.Count - 1 If ocBuddies(i).Nick = nick Then If online Then ocBuddies(i).State = BuddyState.Online Else ocBuddies(i).State = BuddyState.Offline End If OnPropertyChanged("Buddies") Exit For End If Next RaiseEvent BuddyOnlineStatusChanged(nick, online) End Sub Public Sub UpdateInGameStatus(ByVal XwisNick As String, ByVal gamehost As String) Dim nick As String = XwisNick.ToLower For i As Integer = 0 To ocBuddies.Count - 1 If ocBuddies(i).Nick = nick Then ocBuddies(i).IsInGame = True ocBuddies(i).GameHost = gamehost OnPropertyChanged("Buddies") RaiseEvent BuddyGameStatusChanged(nick, gamehost) Exit For End If Next End Sub Public Sub FillBuddyCheck() BuddyCheck = ocBuddies.Where(Function(bud) bud.State &lt;&gt; BuddyState.Blocked).ToList End Sub Public Function GetBuddies() As IEnumerable(Of Buddy) Return ocBuddies.Where(Function(bud) bud.State &lt;&gt; BuddyState.Blocked) End Function Public Sub Sort() ocBuddies.OrderBy(Function(bud) bud.Nick) OnPropertyChanged("Buddies") End Sub Public Function Count() As Integer Return GetBuddies.Count End Function Public Event BuddyOnlineStatusChanged(ByVal nick As String, ByVal online As Boolean) Public Event BuddyGameStatusChanged(ByVal nick As String, ByVal gamehost As String) Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged ' Create the OnPropertyChanged method to raise the event Protected Sub OnPropertyChanged(ByVal name As String) Try RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name)) Catch End Try End Sub End Class </code></pre> <p>How I interact with the classes:</p> <pre><code> Public Function GetBuddyManager() As BuddyManager Try Return DirectCast(FindResource("bmBuddyManager"), BuddyManager) Catch ex As Exception MessageBox.Show("Error getting buddy manager object: " &amp; ex.ToString()) Application.Current.Shutdown() Return Nothing End Try End Function GetBuddyManager().UpdateOnlineStatus(GetBuddyManager().BuddyCheck(0).Nick, True) </code></pre> <p>The Binding and grouping work well, the only issue is when I set a particular 'buddy' to online or blocked the child nodes do not move or change.</p> <p>I am trying to get this to work like an MSN Treeview where people go offline and online.</p> <p>Any help is appreciated, I have been working on this problem for a month or so with heavy research and no luck.</p> <p>Thank you for your time.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload