This is a migrated thread and some comments may be shown as answers.

Update Child Items from ViewModel Not Showing in UI

4 Answers 258 Views
TreeView
This is a migrated thread and some comments may be shown as answers.
Betsy
Top achievements
Rank 1
Betsy asked on 20 Oct 2010, 02:32 PM
WPF, VS 2010

I have a treeview bound to a collection of objects that implement INotifyPropertyChanged.  The AssociatedOfferings child collection is a collection of the same type of object.  When I change a value of one of the objects from the ViewModel the change is not reflected in the TreeView.  My View is as follows:

<HierarchicalDataTemplate x:Key="TopItemTemplate" ItemsSource="{Binding AssociatedOfferings}">
      <StackPanel Orientation="Horizontal">
        <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding IsEnabled}"   />
        <TextBlock Text="{Binding Name}" Margin="10,0,0,0" />
      </StackPanel>
    </HierarchicalDataTemplate>
  
<telerik:RadTreeView ItemsSource="{Binding Items}" DataContext="{Binding}" ItemTemplate="{DynamicResource TopItemTemplate}" />

Then in the ViewModel if I take one of the objects and set its IsSelected property to True, or the Name to something else, the change is not reflected in the View.

4 Answers, 1 is accepted

Sort by
0
Petar Mladenov
Telerik team
answered on 22 Oct 2010, 04:05 PM
Hi Heather,

Changes in your business items collection ( AssociatedOfferings) like changing property of an ite ,  reordering of items or drag`N`drop of items,  affect  the RadTreeView  only if the collection implements the   INotifyCollectionChanged interface. For instance,  you can use an ObservableCollection. 

Please ensure your application meets this requirement and  if it does and the problem still occurs please send me a sample reproducing your issues. I would be glad to assist you.

Sincerely yours,
Petar Mladenov
the Telerik team

Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
0
Betsy
Top achievements
Rank 1
answered on 22 Oct 2010, 04:14 PM
Here is the definition of my class objects and as you can see the Class inherits from EntityBase (which implements INotifyPropertyChanged) and the collection of associatedobjects is an ObsesrvableCollection.

Public Class ServiceOfferingSelect
  Inherits EntityBase
  Public Sub New()
    'noop
  End Sub
  Public Sub New(ByVal source As Entities.ServiceOffering)
    _id = source.ServiceOfferingId
    _name = source.ServiceName
    If source.DiscountRates.Count > 0 Then
      Me.Discounts = (From d In source.DiscountRates Select New ListItem With {.Id = d.DiscountRateID, .Name = d.DiscountName}).ToList
    End If
  End Sub
  Private _id As Integer
  Public Property Id() As Integer
    Get
      Return _id
    End Get
    Set(ByVal value As Integer)
      _id = value
    End Set
  End Property
  Private _name As String
  Public Property Name() As String
    Get
      Return _name
    End Get
    Set(ByVal value As String)
      _name = value
    End Set
  End Property
  Public Property Discounts As List(Of ListItem)
  Public ReadOnly Property HasDiscounts As Boolean
    Get
      If Discounts Is Nothing Then
        Return False
      Else
        Return Discounts.Count > 0
      End If
    End Get
  End Property
  Public ReadOnly Property IsEnabled() As Boolean
    Get
      Return Not _enrollmentid.HasValue
    End Get
  End Property
  Private _enrollmentid As Nullable(Of Integer)
  Public Property EnrollmentId() As Nullable(Of Integer)
    Get
      Return _enrollmentid
    End Get
    Set(ByVal value As Nullable(Of Integer))
      _enrollmentid = value
    End Set
  End Property
  Private _selecteddiscountid As Nullable(Of Integer)
  Public Property SelectedDiscountId() As Nullable(Of Integer)
    Get
      Return _selecteddiscountid
    End Get
    Set(ByVal value As Nullable(Of Integer))
      _selecteddiscountid = value
    End Set
  End Property
  Private _parentserviceid As Nullable(Of Integer)
  Public Property ParentServiceId() As Nullable(Of Integer)
    Get
      Return _parentserviceid
    End Get
    Set(ByVal value As Nullable(Of Integer))
      _parentserviceid = value
    End Set
  End Property
  Private _associationrule As ServiceOfferingAssociationRule = ServiceOfferingAssociationRule.NotApplicable
  Public Property AssociationRule() As ServiceOfferingAssociationRule
    Get
      Return _associationrule
    End Get
    Set(ByVal value As ServiceOfferingAssociationRule)
      _associationrule = value
    End Set
  End Property
  Private _associatedofferings As ObservableCollection(Of PresentationModel.ServiceOfferingSelect)
  Public Property AssociatedOfferings() As ObservableCollection(Of PresentationModel.ServiceOfferingSelect)
    Get
      If _associatedofferings Is Nothing Then
        _associatedofferings = New ObservableCollection(Of PresentationModel.ServiceOfferingSelect)
      End If
      Return _associatedofferings
    End Get
    Set(ByVal value As ObservableCollection(Of PresentationModel.ServiceOfferingSelect))
      _associatedofferings = value
    End Set
  End Property
  Private _isselected As Boolean
  Public Property IsSelected() As Boolean
    Get
      Return _isselected
    End Get
    Set(ByVal value As Boolean)
      If Not _isselected.Equals(value) Then
        _isselected = value
        OnPropertyChanged("IsSelected")
        For Each itm In AssociatedOfferings
          If itm.AssociationRule = ServiceOfferingAssociationRule.Required Then
            itm.IsSelected = True
          End If
        Next
      End If
    End Set
  End Property
End Class

I will try and put together a sample and submit as a ticket.

EDIT: I put together a sample and it works in my sample.  The code is exactly what is in my real app.  Can't figure out why it works in my sample but not in my app, will have to research further.
0
Petar Mladenov
Telerik team
answered on 27 Oct 2010, 06:03 PM
Hi Heather,

I prepared a sample project for you that demonstrates binding a boolean property of a business object to  checkbox in your visual presentation. ( Note that RadTreeView has checkbox support -->http://www.telerik.com/help/wpf/check-box-support.html )  Please examine it and see  if you are missing something in your project because we are unable to reproduce your issue using  the code you provided .
If the sample doesn`t help you, could you please send us your project ? 

Sincerely yours,
Petar Mladenov
the Telerik team
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
0
Betsy
Top achievements
Rank 1
answered on 27 Oct 2010, 06:07 PM
I apologize, I haven't had time to update this ticket.  I found the issue...it was an issue in my base class that was causing the NotifyPropertyChanged to not get fired in my app.  Once I fixed that issue the problem went away.
Tags
TreeView
Asked by
Betsy
Top achievements
Rank 1
Answers by
Petar Mladenov
Telerik team
Betsy
Top achievements
Rank 1
Share this question
or