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


Автор: AntiInt 7.10.2013, 08:58
Всем привет! собтвенно вот:

Код

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 не обновляется, что делать?

Автор: dzaraev 7.10.2013, 10:44
Цитата

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

Свойство не обновляется или не возникает события PropertyChanged с propertyName равным "B"?
Потому что если именно значение свойства не меняется, то вы просто забыли его поменять, т.к. не видно, чтобы где-то было B = A.

Автор: AntiInt 7.10.2013, 11:16
я принудительно обновляю в сеттере свойтва A свойство B.
Его значение изменяется, а вот похоже событие не срабатывает.

Автор: AntonX 7.10.2013, 12:43
Вообще то у Вас очень странный код.
Подделка генерации события "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://ru.vingrad.com/INotifyPropertyChanged-id52524de3ae2015ac0f000000#findElement_E7045_5252824dae2015e14600048e_0

Автор: AntiInt 7.10.2013, 15:01
Этот вариант также не работоспособен...
Почему плохо пахнет? У свойства В нет сеттера только геттер, поэтому нет другого варианта заставить вью узнать, что свойтво модели изменилось.

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

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

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

Автор: AntiInt 8.10.2013, 06:34
Код

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>


Что к чему  - не понятно.

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

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

Автор: AntiInt 8.10.2013, 10:43
нет, Dispensers не null - факт, странность в том, что когда работает сеттер, то все методы в нем отрабатывают.
и когда приисходят вызовы OnPropertyChanged("A") и OnPropertyChanged("B") то так же все сначала нормально, НО
я четко вижу как работает геттер для А(что логично, т.к. свойство обновляется), но геттер для B не работает.
Вот в чем загадка?

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

никто на форуме гадать не будет. скиньте сюда упрощенный пример проекта, на нем и посмотрим

Автор: AntiInt 8.10.2013, 14:09
К сожалению, проект кинуть не могу,только вот этот код...

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