Моя проблема проста.У меня есть древовидное представление, привязанное к ObservableCollection объектов, и у всех этих объектов есть свои собственные ObservableCollections.Основываясь на выборе пользователем других критериев на моей странице, я хочу динамически установить, какие флажки отмечены. К сожалению, мои чекбоксы не могут обновить свой статус IsChecked после того, как я изменил соответствующее свойство bool, привязанное к IsChecked .Флажки будут в правильном состоянии при первом развертывании любого узла, но после этого они прекращают обновление.Я подозреваю, что это означает, что объекты не создаются / оцениваются, пока они не должны быть показаны в первый раз.
Структура данных Silverlight -> ViewModel -> ObservableCollection of StoreGroups LocalStoreGroups -> StoreGroup имеет ObservableCollectionStore Stores
Посредством отладки я заметил, что к этому не привязаны обработчики. PropertyChanged, и мне интересно, если это проблема?
Элемент управления Treeview:
<controls:TreeView ItemsSource="{Binding LocalStoreGroups}" ItemTemplate="{StaticResource TreeviewStoreGroupTemplate}" />
В моем проекте я использую древовидную структуру со следующими HeirarchalDataTemplates:
<UserControl.Resources>
<sdk:HierarchicalDataTemplate x:Key="TreeviewStoreTemplate">
<CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}" Content="{Binding DTO.Name}" />
</sdk:HierarchicalDataTemplate>
<sdk:HierarchicalDataTemplate x:Key="TreeviewStoreGroupTemplate" ItemsSource="{Binding Stores}" ItemTemplate="{StaticResource TreeviewStoreTemplate}">
<CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}" Content="{Binding DTO.Name}" />
</sdk:HierarchicalDataTemplate>
</UserControl.Resources>
Код свойства IsSelected (и объект StoreGroup, и объект Store имеют это свойство:
private bool _IsSelected;
public bool IsSelected
{
get { return _IsSelected; }
set
{
_IsSelected = value;
OnPropertyChanged("IsSelected");
}
}
protected void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChangedEventHandler temp = this.PropertyChanged;
if (null != temp)
temp(this, e);
}
Код для изменения IsSelected
foreach (Store s in LocalStoreGroups.SelectMany(sg => sg.Stores))
{
s.IsSelected = false;
}
foreach (StoreLink link in links)
{
Store targetStore = (from s in LocalStoreGroups.SelectMany(sg => sg.Stores) where s.DTO.ID == link.DTO.StoreID select s).FirstOrDefault();
targetStore.IsSelected = true;
}