![](/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.