【发布时间】:2018-11-02 17:14:49
【问题描述】:
这是步骤。
- 触发 EventAggregator 并发送消息。
- 在 IHandle 中捕获消息。
- 更新一个TextBlock。(根本不更新TextBlock绑定:(
这是一个简单的逻辑。但不适用于 Caliburn.Micro。请检查我的代码。
I make a sample project in GitHub.
您只需单击按钮即可对其进行测试。
这是视图模型
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);
}
}
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 网页不喜欢长代码。 然后,我在打字…………
【问题讨论】:
标签: events caliburn.micro