Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PropertyChanged всегда null 
:(
    Опции темы
aush
  Дата 21.12.2011, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 4.6.2007

Репутация: нет
Всего: нет



Не могу понять, в чем моя ошибка.

Есть объект в виде дерева, у каждого элемента есть имя и статус (активен/не активен). Имя корня идет в заголовок окна, из имен его ветвей делаются табы, в табах листбоксы. Делаю привязку:

Код

<Window x:Class="MyProj.MainWindow" Title="{Binding Name}">
    <Window.Resources>
        <Style x:Key="TabItemContainerStyle" TargetType="TabItem">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsActive}" Value="true">
                    <Setter Property="IsSelected" Value="true" />
                </DataTrigger>
                <DataTrigger Binding="{Binding IsActive}" Value="false">
                    <Setter Property="IsSelected" Value="false" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>

    <Grid>
        <TabControl x:Name="_tabControl" 
                    ItemContainerStyle="{StaticResource TabItemContainerStyle}"
                    ItemsSource="{Binding Childs}" >
            <TabControl.ItemTemplate>
                <DataTemplate>
                    <DockPanel>
                        <TextBlock Width="auto" DockPanel.Dock="Right" Text="{Binding Name}" />
                    </DockPanel>
                </DataTemplate>
            </TabControl.ItemTemplate>
            <TabControl.ContentTemplate>
                <DataTemplate>
                    <ListBox ItemsSource="{Binding ElementName=_tabControl, Path=SelectedItem.Childs}">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Name}"/>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>
    </Grid>
</Window>


Код

public MainWindow()
{
    MyObjClassName MyObj = GetTreeObject(); // тут строится сам объект для привязки
    DataContext = MyObj; 
    
    MyObj.Childs.First().IsActive = true; // А тут я хочу сделать выбраным первый таб
}


Сама привязка данных проходит - все Name-ы ложатся по полочкам как и задумано, но откуда бы я не пробовал выставить IsActive = true, PropertyChanged всегда null. И при генерации объекта и на строчке в коде выше и кнопку на форму клал, по нажатию на которую  MyObj.Childs.First().IsActive = true выставлялось.

Код

public class MyObjClassName : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private bool _isActive;
    public bool IsActive {
        get { return _isActive; }
        set {
            _isActive = value;
            if (PropertyChanged != null) // PropertyChanged всегда null
                PropertyChanged(this, new PropertyChangedEventArgs("IsActive")); 
            } 
        }
}


Подскажите, пожалуйста, что я делаю не так?
PM MAIL   Вверх
Gvozdin
Дата 21.12.2011, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

Репутация: 8
Всего: 8



Все должно работать, выкладывайте солюшн с воспроизведением.

Ошибки в Output есть?
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
aush
Дата 22.12.2011, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 4.6.2007

Репутация: нет
Всего: нет



Gvozdin, сделал минимальный проект с описываемым поведением TestBinding
В output-е ошибок нет и вообще ничего, связанно с биндингом.
PM MAIL   Вверх
Gvozdin
Дата 22.12.2011, 13:40 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

Репутация: 8
Всего: 8



Проблема в населении Childs:

Код

            var Form = new Block<Block<Field>> {
                           Name = "Form name",
                           Childs = (from i in Enumerable.Range(0, 3)
                                    select new Block<Field> {
                                               Name = "Tab item name " + i,
                                               Childs = from j in Enumerable.Range(0, 4)
                                                        select new Field { Name = "List item name " + i + " " + j }
                                           })
                        };


С таким населением каждое обращение к Childs генерирует новый набор элементов и по этому IsActive устанавливается совершенно на другом объекте, нежели тот который видит таб контрол.

Как минимум надо добавить ToList() в населении.
Да и определять коллекции как IEnumerable думаю стоит только в конкретных случаях где это необходимо, такое правило поможет избежать подобных ситуаций при использовании linq to XXX.
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
aush
Дата 22.12.2011, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 4.6.2007

Репутация: нет
Всего: нет



Gvozdin, Понятно, спасибо большое!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0835 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.