Свойство зависимости не срабатывает, если функция вызывается из другой ViewModel? - PullRequest
2 голосов
/ 20 мая 2011

В моем usercontrol.xaml.cs. У меня есть это свойство зависимости как bleow.

public static readonly DependencyProperty MessageKeyProperty =
                 DependencyProperty.Register("MessageKey", typeof(String),
                 typeof(UC_MessageEntry),
                     new FrameworkPropertyMetadata(null,
                         new PropertyChangedCallback(MessageKeyPropertyChangedCallback)));


        private static void MessageKeyPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (d is UC_MessageEntry)
            {
                UC_MessageEntryucMessageEntryAccessDenied = (UC_MessageEntry)d;
                if (e.NewValue != null)
                {
                    ResourceBundle resourceBundle = App.ResourceBundle;
                    if (e.NewValue.ToString().Equals("enable"))
                    {
                        ucMessageEntryAccessDenied.txtAceessDeniedMsg.Text = "";
                        return;
                    }

                    String actualMessage = resourceBundle.GetString("Resources", e.NewValue.ToString());
                    if (actualMessage == null)
                    {
                        ucMessageEntryAccessDenied.txtAceessDeniedMsg.Text = resourceBundle.GetString("Resources", "ContractSetup.ExchangeAccessDeniedMessage.OTHERS");
                    }
                    else
                    {
                        ucMessageEntryAccessDenied.txtAceessDeniedMsg.Text = actualMessage;
                    }

                }
                else
                {
                    ucMessageEntryAccessDenied.txtAceessDeniedMsg = null;
                }
            }
        }


        public String MessageKey
        {
            get
            {
                return (String)this.GetValue(MessageKeyProperty);  
            }
            set
            {
                this.SetValue(MessageKeyProperty,value);
            }
        }

В mainwindow.xaml я привязываю этот ключ сообщения, как показано ниже.

  <view_MessageEntry:UC_MessageEntry   
                                x:Uid="local:UC_MessageEntry_1" x:Name="UC_OrderEntry"  MessageKey="{Binding MsgAccessDenied}"
                                Style="{DynamicResource contentControlStyle}" SnapsToDevicePixels="True" Margin="0" />

и за MessageViewModle.cs,

private static readonly PropertyChangedEventArgs MsgAccessDeniedPropertyChangedEventArgs
    = new PropertyChangedEventArgs("MsgAccessDenied");

    private string _msgAccessDenied;
    public string MsgAccessDenied
    { 
       get
       {
           if (_selectedExchange != null)
           {
               return _msgAccessDenied;
           }
           else
           {
               return "enable";
           }
       }
        set
        {
            _msgAccessDenied = value;
            this.RaisePropertyChanged(this, MsgAccessDeniedPropertyChangedEventArgs);
        }

    }


public void FireMsg()
{
  this.MsgAccessDenied="value";
}

При изменении выбора поля со списком я вызвал FireMsg (), и он обновит функцию MessageKeyPropertyChangedCallback в usercontrol.xaml.cs. Работает нормально. Но если я вызываю этот FireMsg () из Other ViewModels, значение _msgAccessDenied обновляется. Но функция MessageKeyPropertyChangedCallback не срабатывает. Любое решение для этой проблемы? Благодаря.

1 Ответ

2 голосов
/ 20 мая 2011

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

Из моего быстрого обзора кода единственный способ увидеть, что происходит:

  • значение MsgAccessDenied установлено
  • , поэтому поле _msgAccessDenied устанавливается
  • метод RaisePropertyChanged вызывается для запуска PropertyChanged
  • подсистема зависимостей делает свое дело, заставляя получить MsgAccessDenied
  • геттер MsgAccessDenied называется
  • геттер проверяет _selectedExchange и этоnull
  • получатель возвращает значение "enable" вместо нового значения _msgAccessDenied
  • предыдущее значение также "enable"
  • подсистема зависимостейговорит, ОК, без изменений
  • обратный вызов изменения свойства не вызывается

В итоге _selectedExchange может скрывать изменения значения в _msgAccessDenied, тем самым предотвращая обратный вызов изменения восходящего потокастрельба.

Это всего лишь теория.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...