如果从其他视图模型调用函数,则不会触发依赖属性

本文关键字:属性 依赖 其他 视图 模型 函数 调用 如果 | 更新日期: 2023-09-27 17:56:55

In my usercontrol.xaml.cs.我有这种依赖性,就像吹嘘一样。

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(),它将更新usercontrol.xaml.cs中的MessageKeyPropertyChangedCallback函数。它工作正常。但是如果我从其他视图模型调用它 FireMsg(),_msgAccessDenied 的值就会更新。但是 MessageKeyPropertyChangedCallback 函数没有触发。这个问题有什么解决方案吗?谢谢。

如果从其他视图模型调用函数,则不会触发依赖属性

你的代码看起来总体上是合理的。 但是,如果未调用依赖项属性更改回调,则几乎可以肯定是因为依赖项属性的值未更改。 如果依赖项属性绑定到源,则可能是因为源没有更改。

从我对代码的快速回顾中,我可以看到这种情况发生的唯一方法是:

    设置
  • MsgAccessDenied的值
  • 这会导致设置字段_msgAccessDenied
  • 调用 RaisePropertyChanged 方法以触发PropertyChanged
  • 依赖子系统执行其强制获取MsgAccessDenied
  • MsgAccessDenied吸吮剂称为
  • getter 检查_selectedExchange它是空
  • getter 返回值 "enable" 而不是新值 _msgAccessDenied
  • 以前的值也被"enable"
  • 依赖子系统说,好的,没有变化
  • 不调用属性更改回调

总之,_selectedExchange可以隐藏_msgAccessDenied中的值变化,从而防止上游更改回调触发。

这只是一个理论。