This question is locked. New answers and comments are not allowed.
I have a xaml with a radtree view on it.
I am using the ContainerBindingCollection, HierarchicalDataTemplate, and a StaticResource as my datasource. I am binding it to my TreeViewDataSource that is in my ViewModel code below:
This is an ObservableCollection of the CountryModel. Each CountryModel has a ObservableCollection of a StateModel along with an ID, Name, and Selected properties. Each StateModel has an ObservableCollection of a DMAModel along with an ID, Name, and Selected properties. Each DMAModel has an ID, Name, Selected properties.
DMAModel:
StateModel:
CountryModel:
I have also implemented the INotifyPropertyChanged on each of the Models.
Upon running my application, I do get a TreeView that has my information correctly displayed, checked and formatted. When I check/uncheck any of the boxes in my TreeView, I do not receive any NotifyPropertyChanged in my Country, State, or DMA models.
What I am missing or doing wrong?
<UserControl xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" x:Class="Geomentum.MediaReach.Modules.AreaSelection.View.AreaSelectionView" xmlns:local="clr-namespace:Geomentum.MediaReach.Modules.AreaSelection.ViewModel" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <UserControl.Resources> <telerik:ContainerBindingCollection x:Name="BindingsCollection"> <telerik:ContainerBinding PropertyName="IsChecked" Binding="{Binding Selected, Mode=TwoWay}" /> </telerik:ContainerBindingCollection> <telerik:HierarchicalDataTemplate x:Key="DMATemplate" telerik:ContainerBinding.ContainerBindings="{StaticResource BindingsCollection}"> <TextBlock Text="{Binding Name}" Foreground="Black" FontSize="10" FontFamily="Verdana" /> </telerik:HierarchicalDataTemplate> <!--Data template for the State object--> <telerik:HierarchicalDataTemplate x:Key="StateTemplate" telerik:ContainerBinding.ContainerBindings="{StaticResource BindingsCollection}" ItemTemplate="{StaticResource DMATemplate}" ItemsSource="{Binding DMAs}"> <TextBlock Text="{Binding Name}" Foreground="Black" FontSize="10" FontFamily="Verdana" /> </telerik:HierarchicalDataTemplate> <!--Data template for the Country object--> <telerik:HierarchicalDataTemplate x:Key="CountryTemplate" telerik:ContainerBinding.ContainerBindings="{StaticResource BindingsCollection}" ItemTemplate="{StaticResource StateTemplate}" ItemsSource="{Binding States}"> <TextBlock Text="{Binding Name}" Foreground="Black" FontSize="10" FontFamily="Verdana" /> </telerik:HierarchicalDataTemplate> <local:AreaSelectionSource x:Key="TreeViewDataSource"/> <Style x:Key="ItemContainerStyle" TargetType="telerik:RadTreeViewItem"> <Setter Property="IsExpanded" Value="True"/> </Style> </UserControl.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="40" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <telerik:RadTreeView Grid.Row="0" ItemTemplate="{StaticResource CountryTemplate}" ItemContainerStyle="{StaticResource ItemContainerStyle}" ItemsSource="{Binding Source={StaticResource TreeViewDataSource}}" IsOptionElementsEnabled="True" ItemsOptionListType="CheckList" /> </Grid> </UserControl> I am using the ContainerBindingCollection, HierarchicalDataTemplate, and a StaticResource as my datasource. I am binding it to my TreeViewDataSource that is in my ViewModel code below:
public class AreaSelectionSource : ObservableCollection<CountryModel> { public AreaSelectionSource() { CountryModel c1 = new CountryModel() { Name = "USA1", ID = 1, Households = 100, Selected = true }; StateModel s1 = new StateModel() { Name = "Illinois", ID = 2, Households = 200, Selected = false }; StateModel s2 = new StateModel() { Name = "Indiana", ID = 3, Households = 200, Selected = true }; c1.States.Add(s1); c1.States.Add(s2); s1.DMAs.Add(new DMAModel() { Name="Chicago", ID=1, Selected=true, Households = 200 }); s1.DMAs.Add(new DMAModel() { Name="Rockford", ID=2, Selected=false, Households = 200 }); this.Add(c1); } }DMAModel:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.ComponentModel; using System.Collections.ObjectModel; using Microsoft.Practices.Prism.Commands; using Microsoft.Practices.Prism.Events; using System.Diagnostics; namespace Geomentum.MediaReach.Infrastructure.Models { public class DMAModel : INotifyPropertyChanged { private string _name; private int _id; private bool _selected; private int _households; public DMAModel() { } public string Name { get { return _name; } set { this._name = value; } } public int ID { get { return _id; } set { this._id = value; } } public bool Selected { get { return this._selected; } set { if (!value.Equals(_selected)) { _selected = value; NotifyPropertyChanged("Selected"); } } } public int Households { get { return _households; } set { this._households = value; } } #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } #endregion } } StateModel:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.ComponentModel; using System.Collections.ObjectModel; using Microsoft.Practices.Prism.Commands; using Microsoft.Practices.Prism.Events; using System.Diagnostics; namespace Geomentum.MediaReach.Infrastructure.Models { public class StateModel : INotifyPropertyChanged { private string _name; private int _id; private bool _selected; private int _households; private ObservableCollection<DMAModel> _dmaList; public StateModel() { this._dmaList = new ObservableCollection<DMAModel>(); } public string Name { get { return this._name; } set { this._name = value; } } public int ID { get { return this._id; } set { this._id = value; } } public bool Selected { get { return this._selected; } set { if (!value.Equals(_selected)) { _selected = value; NotifyPropertyChanged("Selected"); } } } public int Households { get { return this._households; } set { this._households = value; } } public ObservableCollection<DMAModel> DMAs { get { return this._dmaList; } set { this._dmaList = value; } } #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } #endregion } } CountryModel:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.ComponentModel; using System.Collections.ObjectModel; using Microsoft.Practices.Prism.Commands; using Microsoft.Practices.Prism.Events; using System.Diagnostics; namespace Geomentum.MediaReach.Infrastructure.Models { public class CountryModel : INotifyPropertyChanged { private string _name; private int _id; private bool _selected; private int _households; private ObservableCollection<StateModel> _stateList; public string Name { get { return this._name; } set { this._name = value; } } public int ID { get { return this._id; } set { this._id = value; } } public bool Selected { get { return this._selected; } set { if (!value.Equals(_selected)) { _selected = value; NotifyPropertyChanged("Selected"); } } } public int Households { get { return this._households; } set { this._households = value; } } public ObservableCollection<StateModel> States { get { return this._stateList; } set { this._stateList = value; } } #region Constructors /// <summary> /// Class initializer. /// </summary> public CountryModel() { this._stateList = new ObservableCollection<StateModel>(); } #endregion #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } #endregion } } I have also implemented the INotifyPropertyChanged on each of the Models.
Upon running my application, I do get a TreeView that has my information correctly displayed, checked and formatted. When I check/uncheck any of the boxes in my TreeView, I do not receive any NotifyPropertyChanged in my Country, State, or DMA models.
What I am missing or doing wrong?