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}");
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。。。