簡體   English   中英

如何在Caliburn.Micro應用程序中訪問ShellViewModel?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM