![](/img/trans.png)
[英]Shared Child ViewModel To ShellViewmodel on caliburn.Micro
[英]How to access ShellViewModel in an Caliburn.Micro application?
我在Caliburn.Micro上有一个WPF应用程序。 主要的ViewModel是ShellViewModel。 它包含一个选项卡控件,并且每个选项卡都包含一个用户控件。 我需要从该内部用户控件访问ShellViewModel的属性。
var par =(((MyApp.ShellViewModel)((Screen)Parent).MyProperty;
ShellViewModel是未知的。 您能告诉我如何使用吗?
谢谢。
var parent = IoC.Get<ShellViewModel>();
我目前无法验证该语法,但我认为这是正确的。
好的,从您的评论看来,您的外壳上似乎有一个组合框,需要影响这些选项卡之一上显示的内容。
要在您的ViewModel之间进行通信,您始终可以使用EventAggregator
它是CM的一部分)并实现一个订户模式,您可以利用该模式
例如
在您的Shell VM上,您可以创建聚合器的静态实例或创建单独的静态类,该类将向应用程序提供聚合器
static class AggregatorProvider
{
// The event aggregator
public static EventAggregator Aggregator = new EventAggregator();
}
class ShellViewModel : Conductor<IScreen>
{
// When the combo box selection changes...
public void SelectionChanged(object SomeValue)
{
// Publish an event to all subscribers
AggregatorProvider.Aggregator.Publish(new SelectionChangedMessage(SomeValue));
}
}
您可以使用标准操作消息或约定来处理组合框的SelectionChanged
(我不确定CM默认将哪些约定应用于该组合,因此在示例中将显示显式绑定)
<ComboBox x:Name="MyCombo" cal:Message.Attach="[Event SelectionChanged] = [Action SelectionChanged(MyCombo)" />
希望如果应用了正确的约定,则应该将所选项目传递给该方法
您的子VM仅需要订阅聚合器并实现IHandle,其中T是它应处理的消息类型
class ChildViewModel : Screen, IHandle<SelectionChangedMessage>
{
public ChildViewModel()
{
// Subscribe to the aggregator so we receive messages from it
AggregatorProvider.Aggregator.Subscribe(this);
}
// When we receive a SelectionChangedMessage...
public void Handle(SelectionChangedMessage message)
{
// Do something with the new selection
}
}
SelectionChangedMessage
可以只是:
class SelectionChangedMessage
{
public object NewValue { get; private set; }
public SelectionChangedMessage(object newValue)
{
NewValue = newValue;
}
}
显然,以上内容可能是通用类型,因此您可以强烈键入NewValue
参数-然后,您发布的消息可以是任何内容,因此由您自己决定
可能需要指出的是,您可以从聚合器Unsubscribe
,以便您可以控制何时接收通知。 聚合器始终使用弱引用,因此您不必担心取消订阅,但这确实意味着您可以控制对象何时接收消息(即,通过订阅OnActivate
和取消订阅OnDeactivate
停止监听对象何时不活动) 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.