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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> INotifyPropertyChanged 
:(
    Опции темы
AntiInt
Дата 7.10.2013, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем привет! собтвенно вот:

Код

class ViewModel:INotifyPropertyChanged
{
         public OnPropertyChangedEventRaise(string propertyName)
         {
               if(PropertyChanged!=null)    PropertyChanged(this,new PropertyChandgedEventArg(propertyName));
         }

         public string A
        {
             set
{
     OnPropertyChanged("A");
    OnPropertyChanged("B");
}
        }
public string B
{
get{...}
}

}


Вот при обновлении свойтва A, свойство B не обновляется, что делать?
PM MAIL   Вверх
dzaraev
Дата 7.10.2013, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

свойство B не обновляется,

Свойство не обновляется или не возникает события PropertyChanged с propertyName равным "B"?
Потому что если именно значение свойства не меняется, то вы просто забыли его поменять, т.к. не видно, чтобы где-то было B = A.
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
AntiInt
Дата 7.10.2013, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



я принудительно обновляю в сеттере свойтва A свойство B.
Его значение изменяется, а вот похоже событие не срабатывает.
PM MAIL   Вверх
AntonX
Дата 7.10.2013, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вообще то у Вас очень странный код.
Подделка генерации события "B" в коде установщика "A" это уже плохо пахнет.
Ожидалось видеть что-то такое:
Код

class ViewModel:INotifyPropertyChanged{
        public OnPropertyChangedEventRaise(string propertyName)
        {
         if(PropertyChanged!=null)    PropertyChanged(this,new ropertyChandgedEventArg(propertyName));
        }

        public string A
        {
            get{...}
         set
            {
             // ... set backfield, atc
              OnPropertyChanged("A");
                B = // ... set new value of B
            }
        }
        public string B
        {
            get{...}
            private set
            {
             // ... set backfield, atc
             OnPropertyChanged("B");
            }
        }
}



Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL ICQ   Вверх
AntiInt
Дата 7.10.2013, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Этот вариант также не работоспособен...
Почему плохо пахнет? У свойства В нет сеттера только геттер, поэтому нет другого варианта заставить вью узнать, что свойтво модели изменилось.
PM MAIL   Вверх
dzaraev
Дата 7.10.2013, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нужно больше минералов кода, т.к. пока не понятно (по крайней мере мне), что могло вызвать проблемы. В приведённом кусочке всё верно обновляется и событие должно возникать.

Цитата(AntonX @  7.10.2013,  12:43 Найти цитируемый пост)
Подделка генерации события "B" в коде установщика "A" это уже плохо пахнет.

Это нормальная практика, когда значение свойства B напрямую или косвенно зависит от значения свойства A, но своего сеттера не имеет (как и сказал AntiInt). Например если B вычисляется на основе других свойств.

Это сообщение отредактировал(а) dzaraev - 7.10.2013, 16:04
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
AntiInt
Дата 8.10.2013, 06:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

public class MainWindowViewModel : BaseViewModel, IMainWindowViewModel
    {
        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion     

        public FuelDispenserSideDTO SelectedDispenserSide
        {
            get
            {
                return _selectedDispenserSide;
            }

            set
            {
                if (_selectedDispenserSide != value)
                {
                    _selectedDispenserSide = value;
                    OnPropertyChanged("SelectedDispenserSide");
                    OnPropertyChanged("FuelsForSelection");
                }
            }
        }

        public ObservableCollection<FuelDTO> FuelsForSelection
        {
            get
            {
                return ObservableCollection<FuelDTO>(Dispensers.Where(dispenser => dispenser.FuelDispenserSide.Equals(SelectedDispenserSide))
                                                               .Select(dispenser => dispenser.FuelTank.Fuel));
            }
            
        }

        public FuelDTO SelectedFuel
        {
            get
            {
                return _selectedFuel;
            }

            set
            {
                if (_selectedFuel != value)
                {
                    _selectedFuel = value;
                    OnPropertyChanged("SelectedFuel");
                }
        }      
    }


Xaml этого дела:
Код

<telerik:RadComboBox Grid.Column="1" VerticalAlignment="Center" Margin="5 0 5 0" ItemsSource="{Binding DispenserSides}" SelectedItem="{Binding SelectedDispenserSide}" DisplayMemberPath="Number" CanKeyboardNavigationSelectItems="True" OpenDropDownOnFocus="True"/>
                <telerik:RadComboBox  x:Name="cbxFuels" ItemsSource="{Binding FuelsForSelection,Mode=OneWay}" Margin="5 0 5 0" Grid.Row="1"  Grid.Column="1" VerticalAlignment="Center"  DisplayMemberPath="PetrochemicalName" SelectedItem="{Binding SelectedFuel}" CanKeyboardNavigationSelectItems="True" OpenDropDownOnFocus="True"/>
                <TextBlock Margin="5 0 5 0" VerticalAlignment="Center" Grid.Row="2">
                    <Run Text="{StaticResource PaymentType}"/>
                    <Run Text=":"/>
                </TextBlock>


Что к чему  - не понятно.
PM MAIL   Вверх
likegift
Дата 8.10.2013, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



обычно, если геттер не дернулся, значит при "инициализации" свойства B произошла ошибка. Посмотри output - возможно, там NullReferenceException. Поставьте точку останова на гетере, посмотрите что он возвращает при первом обращении. В конечном счете можно убрать проверку на исключения прямо в биндинге -NotifyOnValidationError=False

полюбому этот Dispensers нулевой при первом обращении;)

Это сообщение отредактировал(а) likegift - 8.10.2013, 09:23
PM MAIL   Вверх
AntiInt
Дата 8.10.2013, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



нет, Dispensers не null - факт, странность в том, что когда работает сеттер, то все методы в нем отрабатывают.
и когда приисходят вызовы OnPropertyChanged("A") и OnPropertyChanged("B") то так же все сначала нормально, НО
я четко вижу как работает геттер для А(что логично, т.к. свойство обновляется), но геттер для B не работает.
Вот в чем загадка?
PM MAIL   Вверх
likegift
Дата 8.10.2013, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(AntiInt @ 8.10.2013,  13:43)
Вот в чем загадка?

никто на форуме гадать не будет. скиньте сюда упрощенный пример проекта, на нем и посмотрим
PM MAIL   Вверх
AntiInt
Дата 8.10.2013, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



К сожалению, проект кинуть не могу,только вот этот код...

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


 




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


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

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