2013-10-14 94 views
0
設置Caliburn.Micro ControlContent

我是新來Caliburn.Micro (和MVVM爲此事),我試圖激活屏幕位於ShellViewModel從按鈕子之內我的嚮導viewmodel(一個叫導體)。我見過的所有教程都有實際外殼中的按鈕,可以在兩者之間切換,所以我有點迷路。從另一個視圖模型

所有的ViewModels共享命名空間SafetyTraining.ViewModels

ShellViewModel(第一次使用過一個殼,所以我可能在錯誤的方式來使用它)

public class ShellViewModel : Conductor<object>.Collection.OneActive, IHaveDisplayName 
{   
    public ShellViewModel() 
    { 
     ShowMainView(); 
    } 

    public void ShowMainView() 
    { 
     ActivateItem(new MainViewModel()); 
    } 
} 

ShellView XAML

<UserControl x:Class="SafetyTraining.Views.ShellView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
<DockPanel> 
    <ContentControl x:Name="ActiveItem" /> 
</DockPanel> 

MainViewModel - 主屏幕(正確顯示)。

public class MainViewModel : Screen 
{ 
    public void ShowLoginPrompt() 
    { 
     LoginPromptViewModel lg = new LoginPromptViewModel();//This does happen 
    } 
} 

MainView XAML

<Button cal:Message.Attach="[Event Click] = [ShowLoginPrompt]">Login</Button> 

LoginPromptViewModel

public class LoginPromptViewModel : Screen 
{ 
    protected override void OnActivate() 
    { 
     base.OnActivate(); 
     MessageBox.Show("Hi");//This is for testing - currently doesn't display 
    } 
} 

編輯工作代碼:

修改嗅探器的代碼位妥善適合我的結構。謝謝:)

var parentConductor = (Conductor<object>.Collection.OneActive)(this.Parent); 
     parentConductor.ActivateItem(new LoginPromptViewModel()); 

回答

1

你做正確的一切,但你缺少的一件事,但:

public void ShowLoginPrompt() 
{ 
    LoginPromptViewModel lg = new LoginPromptViewModel();//This does happen 
} 

你正在創建的LoginPromptViewModel的實例,但你說的不是導體,以激活該實例,所以它的OnActivate()方法永遠不會被調用。

現在我纔給你一個解決方案,我應該建議幾件事情:如果您使用的是MainViewModel不同視圖模型之間導航那麼這將是適當的,使MainViewModel導體本身

  1. 如果您不是這樣使用它,那麼也許您應該將按鈕導航到ShellView本身的LoginPromptViewModel

現在回到你的問題,因爲你的MainViewModel擴展Screen然後它有一個Parent財產是指指揮,所以你可以做這樣的:

public void ShowLoginPrompt() 
{ 
    LoginPromptViewModel lg = new LoginPromptViewModel();//This does happen 
    var parentConductor = (Conductor)(lg.Parent); 
    parentConductor.Activate(lg); 
} 
+0

它是定製的差異,或只是版本差異(我使用1.5.2),你通過Conductor no param(不適用於我)和Active而不是ActivateItem來做到這一點?只是想知道 – PRX

+0

@PRX對不起,我不完全明白你在問什麼? –

+0

沒關係我想我得到爲什麼XD – PRX

相關問題