Events Caliburn.Micro/属性未在IHandle/EventAggregator中更新

Events Caliburn.Micro/属性未在IHandle/EventAggregator中更新,events,caliburn.micro,Events,Caliburn.micro,这是第一步 启动EventAggregator并发送消息 用IHandle捕捉信息 更新文本块。(根本不更新文本块绑定:( 这是一个简单的逻辑。但不能在Caliburn.Micro上工作。请检查我的代码 您只需单击按钮即可进行测试 这是ViewModel public void PublishOnBackgroundThread(int flag) { Debug.WriteLine($"PublishOnBackgroundThread/{flag}");

这是第一步

  • 启动EventAggregator并发送消息
  • 用IHandle捕捉信息
  • 更新文本块。(根本不更新文本块绑定:(
  • 这是一个简单的逻辑。但不能在Caliburn.Micro上工作。请检查我的代码

    您只需单击按钮即可进行测试

    这是ViewModel

        public void PublishOnBackgroundThread(int flag) {
    
            Debug.WriteLine($"PublishOnBackgroundThread/{flag}");
            ix++;
            if( flag == 0)
            {
                _eventAggregator.PublishOnBackgroundThread(new HelloMessage(ix.ToString(), false));
            }
            else if( flag == 1)
            {
                _eventAggregator.PublishOnBackgroundThread(new HelloMessage(ix.ToString(), true));
            }
        }
    
        public void PublishOnCurrentThread(int flag)
        {
            Debug.WriteLine($"PublishOnCurrentThread/{flag}");
            ix++;
            if (flag == 0)
            {
                _eventAggregator.PublishOnCurrentThread(new HelloMessage(ix.ToString(), false));
            }
            else if (flag == 1)
            {
                _eventAggregator.PublishOnCurrentThread(new HelloMessage(ix.ToString(), true));
            }
        }
        public void PublishOnUIThread(int flag)
        {
            Debug.WriteLine($"PublishOnUIThread/{flag}");
            ix++;
            if (flag == 0)
            {
                _eventAggregator.PublishOnUIThread(new HelloMessage(ix.ToString(), false));
            }
            else if (flag == 1)
            {
                _eventAggregator.PublishOnUIThread(new HelloMessage(ix.ToString(), true));
            }
        }
        public void PublishOnUIThreadAsync(int flag)
        {
            Debug.WriteLine($"PublishOnUIThreadAsync/{flag}");
            ix++;
            if (flag == 0)
            {
                _eventAggregator.PublishOnUIThreadAsync(new HelloMessage(ix.ToString(), false));
            }
            else if (flag == 1)
            {
                _eventAggregator.PublishOnUIThreadAsync(new HelloMessage(ix.ToString(), true));
            }
        }
    
        public void Handle(HelloMessage message)
        {
    
            Debug.WriteLine($"Handle(HelloMessage message)/{message.UiAsync}/{message.msg}");
            if (message.UiAsync)
            {
                Execute.OnUIThreadAsync(() =>
                {
                    _myText = message.msg;
                    MyText = _myText;
    
                });
                /*Execute.OnUIThread(() =>
                {
                    _myText = message.msg;
                    MyText = _myText;
    
                });*/
            }
            else
            {
                _myText = message.msg;
                MyText = _myText;
            }
        }
    
        private int ix = 0;
        private String _myText = "Update Number at Here !";
        public String MyText
        {
            get { return _myText; }
            set
            {
                Debug.WriteLine($"this.Set(ref _myText, value);");
                this.Set(ref _myText, value);
            }
        }
    
    Nere是xaml

            <StackPanel.Resources>
                <Style TargetType="{x:Type Button}">
                    <Setter Property="Margin" Value="5"/>
                </Style>
            </StackPanel.Resources>
    
            <TextBlock Text="{Binding MyText, Mode=TwoWay}" Margin="50" />
            <Button Content="PublishOnBackgroundThread" cal:Message.Attach="[Event Click]=[Action PublishOnBackgroundThread(0)]"/>
            <Button Content="PublishOnCurrentThread" cal:Message.Attach="[Event Click]=[Action PublishOnCurrentThread(0)]"/>
            <Button Content="PublishOnUIThread" cal:Message.Attach="[Event Click]=[Action PublishOnUIThread(0)]"/>
            <Button Content="PublishOnUIThreadAsync" cal:Message.Attach="[Event Click]=[Action PublishOnUIThreadAsync(0)]"/>
    
    
            <Button Content="PublishOnBackgroundThread + Execute.OnUIThreadAsync" cal:Message.Attach="[Event Click]=[Action PublishOnBackgroundThread(1)]"/>
            <Button Content="PublishOnCurrentThread + Execute.OnUIThreadAsync" cal:Message.Attach="[Event Click]=[Action PublishOnCurrentThread(1)]"/>
            <Button Content="PublishOnUIThread + Execute.OnUIThreadAsync" cal:Message.Attach="[Event Click]=[Action PublishOnUIThread(1)]"/>
            <Button Content="PublishOnUIThreadAsync + Execute.OnUIThreadAsync" cal:Message.Attach="[Event Click]=[Action PublishOnUIThreadAsync(1)]"/>
    
    
    
    StackOverFlow网页不喜欢长代码。
    然后,我在您的属性
    MyText
    中键入……。

    ,在
    set
    块中写入以下内容:

    set {
        Debug.WriteLine($ "this.Set(ref _myText, value);");
        this.Set(ref _myText, value);
        NotifyOfPropertyChange(() => MyText);
    }
    

    Handle
    方法中删除所有
    NotifyOfPropertyChange(()=>MyText);
    ,因为您现在在更改values属性时调用它。

    在属性
    MyText
    中,在
    集合
    块中写入以下内容:

    set {
        Debug.WriteLine($ "this.Set(ref _myText, value);");
        this.Set(ref _myText, value);
        NotifyOfPropertyChange(() => MyText);
    }
    

    Handle
    方法中删除所有
    NotifyOfPropertyChange(()=>MyText);
    ,因为您现在在更改values属性时调用它。

    如果您想要干净的代码:

    不要初始化私有变量_myText,而是在构造函数中初始化myText

        private readonly IEventAggregator _eventAggregator;
        public BaseViewModel()
        {
            MyText = "Update Number at Here !";
            _eventAggregator = IoC.Get<IEventAggregator>();
        }
    
    然后申报财产:

    private String _myText;
    public String MyText
    {
        get { return _myText; }
        set
        {
            Debug.WriteLine($"this.Set(ref _myText, value);");
            this.Set(ref _myText, value); // or
            //_myText = value;
            //NotifyOfPropertyChange(() => MyText);
        }
    }
    
    最后处理:

        public void Handle(HelloMessage message)
        {
            Debug.WriteLine($"Handle(HelloMessage message)/{message.UiAsync}/{message.msg}");
            if (message.UiAsync)
            {
                Execute.OnUIThreadAsync(() =>
                {
                    MyText = message.msg;
    
                });
                /*Execute.OnUIThread(() =>
                {
                    _myText = message.msg;
                    MyText = _myText;
    
                });*/
            }
            else
            {
                MyText = message.msg;
            }
        }
    
    不要更新私有变量_myText,只更新公共变量myText

    每次更新MyText变量时,NotifyOfPropertyChange都会将更新发送到视图

    使用this.Set或注释中的两行是相同的..它们都调用caliburn中的final方法:

        /// <summary>
        /// Notifies subscribers of the property change.
        /// </summary>
        /// <param name="propertyName">Name of the property.</param>
        // Token: 0x060000BF RID: 191 RVA: 0x0000342C File Offset: 0x0000162C
        public virtual void NotifyOfPropertyChange([CallerMemberName] string propertyName = null)
        {
            if (this.IsNotifying && this.PropertyChanged != null)
            {
                this.OnUIThread(delegate
                {
                    this.OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
                });
            }
        }
    
    //
    ///将属性更改通知订阅者。
    /// 
    ///属性的名称。
    //令牌:0x060000BF RID:191 RVA:0x0000342C文件偏移量:0x0000162C
    公共虚拟void NotifyOfPropertyChange([CallerMemberName]字符串propertyName=null)
    {
    if(this.IsNotifying&&this.PropertyChanged!=null)
    {
    此.OnUIThread(委托
    {
    this.OnPropertyChanged(新PropertyChangedEventArgs(propertyName));
    });
    }
    }
    
    如果需要干净的代码:

    不要初始化私有变量_myText,而是在构造函数中初始化myText

        private readonly IEventAggregator _eventAggregator;
        public BaseViewModel()
        {
            MyText = "Update Number at Here !";
            _eventAggregator = IoC.Get<IEventAggregator>();
        }
    
    然后申报财产:

    private String _myText;
    public String MyText
    {
        get { return _myText; }
        set
        {
            Debug.WriteLine($"this.Set(ref _myText, value);");
            this.Set(ref _myText, value); // or
            //_myText = value;
            //NotifyOfPropertyChange(() => MyText);
        }
    }
    
    最后处理:

        public void Handle(HelloMessage message)
        {
            Debug.WriteLine($"Handle(HelloMessage message)/{message.UiAsync}/{message.msg}");
            if (message.UiAsync)
            {
                Execute.OnUIThreadAsync(() =>
                {
                    MyText = message.msg;
    
                });
                /*Execute.OnUIThread(() =>
                {
                    _myText = message.msg;
                    MyText = _myText;
    
                });*/
            }
            else
            {
                MyText = message.msg;
            }
        }
    
    不要更新私有变量_myText,只更新公共变量myText

    每次更新MyText变量时,NotifyOfPropertyChange都会将更新发送到视图

    使用this.Set或注释中的两行是相同的..它们都调用caliburn中的final方法:

        /// <summary>
        /// Notifies subscribers of the property change.
        /// </summary>
        /// <param name="propertyName">Name of the property.</param>
        // Token: 0x060000BF RID: 191 RVA: 0x0000342C File Offset: 0x0000162C
        public virtual void NotifyOfPropertyChange([CallerMemberName] string propertyName = null)
        {
            if (this.IsNotifying && this.PropertyChanged != null)
            {
                this.OnUIThread(delegate
                {
                    this.OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
                });
            }
        }
    
    //
    ///将属性更改通知订阅者。
    /// 
    ///属性的名称。
    //令牌:0x060000BF RID:191 RVA:0x0000342C文件偏移量:0x0000162C
    公共虚拟void NotifyOfPropertyChange([CallerMemberName]字符串propertyName=null)
    {
    if(this.IsNotifying&&this.PropertyChanged!=null)
    {
    此.OnUIThread(委托
    {
    this.OnPropertyChanged(新PropertyChangedEventArgs(propertyName));
    });
    }
    }
    
    请再次教我。在IHandle内部,我们需要调用“NotifyOfPropertyChange”。它工作正常。但在IHandle外部,通常调用“MyText=\u MyText;”就足够了只是为了更新绑定。为什么我们需要在IHandle中使用NotifyOfPropertyChange?我很困惑。我想NotifyOfPropertyChange==this.Set。有什么不同吗?请再教我一次。在IHandle内部,我们需要调用“NotifyOfPropertyChange”。它工作得很好。但在IHandle之外,通常,调用“MyText=\u MyText”就足够了只是为了更新绑定。为什么我们需要在IHandle中使用NotifyOfPropertyChange?我感到困惑。我认为NotifyOfPropertyChange==this.Set。有什么不同吗?在我看来,Hello Frenchy。我认为“this.Set(ref _myText,value);”等同于“NotifyOfPropertyChange(()=>myText);”…不一样?我应该总是使用这两个吗?根据我的经验,有时候UI只能用“this.Set”更新。然后,我很困惑。请教我更多…对不起,我在复制/粘贴时出错了,是的,代码行this.Set(ref _myText,value);等于注释中的两行谢谢。我还有另一个经验。通常,“this.Set”工作得很好,但是如果我们使用EventAggregator+IHandle,我们必须在IHandle中使用“NotifyOfPropertyChange(()=>MyText);”。这是真的吗?我必须在MyText=NewValue之后运行NotifyOfPropertyChange;你认为呢?你知道原因吗?我不明白为什么你必须…如果你不更新属性,你的代码就可以了.EventAggregator用于发送或订阅事件。订阅事件时会调用Ihandle…我的想法是Hello Frenchy。我认为“this.Set(ref_myText,value);”等同于“NotifyOfPropertyChange(()=>myText);”…不一样吗?我应该总是同时使用这两个吗?根据我的经验,有时候UI只能使用“this.Set”进行更新。然后,我很困惑。请教我更多…很抱歉,我在复制/粘贴时出错了,是的,代码行this.Set(ref _myText,value);等于注释中的两行谢谢。我还有另一个经验。通常,“this.Set”工作得很好,但如果我们使用EventAggregator+IHandle,我们必须使用“NotifyOfPropertyChange”()=>MyText);“在IHandle中。这是真的吗?我必须在MyText=NewValue之后运行NotifyOfPropertyChange;你认为呢?你知道原因吗?我不明白为什么你必须…没有它你的代码就可以了(如果你更新属性)。EventAggregator用于发送或订阅事件。订阅事件时调用IHandle。。。