Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Binding Count ObservableCollection


Автор: DenWPF 17.7.2010, 13:05
есть класс Catalog - он биндится к treeview а в нем есть ObservableCollection Podcatalog

вот хочу прибиндить к treeview количество Podcatalog-ов.

смотрел примеры но все не так как то делают, вообщем не получилось.

Автор: fvoice 19.7.2010, 13:21
не понятно куда это количество должно выводится? в заголовок родительской ноды? тогда

Код

              <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Childrens}">
                  <TextBlock Text={Binding Converter={StaticResource ConverterName}}" />
                </HierarchicalDataTemplate>
              </TreeView.ItemTemplate>


где ConverterName конвертер который получит ваш объект Catalog и вернет вам строку наподобе Name + items.Count()
биндинг без указания path вернет datacontext, а в treeviewitem в контексте, если мне память не изменяет как раз лежит ваш объект Catalog

Автор: DenWPF 20.7.2010, 07:30
спасибо, но теперь проблема, он не обновляется =( и на какое свойство сделать обновление?

Автор: fvoice 20.7.2010, 11:06
Что то я сразу не додумался, сделайте вычисляемое поле в объекте которое будет возвращать нужную инфу в заголовок, забиндите на него без всяких конвертеров и реализуйте для объекта интерфейс INotifyPropertyChanged.. 

Автор: DenWPF 20.7.2010, 17:29
я про бывал...но у меня что то не так выходит..его же надо обновлять когда происходит добавление\удаление элементов ... но я там не чего не миогу записать

Автор: fvoice 21.7.2010, 08:26
а ItemsSource у дерева вы переприсваиваете? или оно забиндено куда-то?
если забиндено, то какой тип коллекции? используйте ObservableCollection, он умеет вызывать события на добавление удаление элементов.

Добавлено @ 08:34
может вам чем то поможет, пример моего контрола на основе дерева, который в итемсорс принимает плоскую коллекцию, и самостоятельно строит дерево..

уже не помню, но по какой то причине использовал не самый оптимальный механизм получения древовидной коллекции.. это так, в оправдание
и еще там комментарий к классу немного устарел.. но общий смысл понятен

Автор: DenWPF 21.7.2010, 11:21
забиндин к DataContext через ObservableCollection и делаю.
но как свойство Count отправить на обновление при изменнении коллекции не знаю.

Автор: fvoice 21.7.2010, 11:56
Код

public ObservableCollection<object> Childrens{get; set;}
..
//где то в конструкторе или на сеттере
Childrens.CollectionChanged += Items_CollectionChanged;
..
//реализация INotifyPropertyChanged
PropertyChanged(this, new PropertyChangedEventArgs(property));
..
void Items_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{     
     //Обновим Count и/или другие свойств объекта на которые забинден Header итема дерева
     PropertyChanged(this, new PropertyChangedEventArgs("Count"));
}

Автор: DenWPF 21.7.2010, 13:25
что то не так:

Код

public Category() 
        {
            _podcategory.CollectionChanged += Items_CollectionChanged;
        }
        void Items_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            PropertyChanged(this, new PropertyChangedEventArgs("Count")); - тут ошибка
        }

пишет не задана ссылка на объекет хотя я не могу понять на какой объект.

Автор: fvoice 21.7.2010, 13:43
PropertyChanged на null проверка нужна, но странно, раз он null значит на него никто не подписан, значит биндинг не работает.. или может это на этапе инициализации только

Автор: DenWPF 21.7.2010, 14:55
new PropertyChangedEventArgs("Count") - не null. хотя и не какой полезной инфы в нем не нашел
ObservableCollection - тоже


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)