2014-06-16 25 views
0

我有我的應用程序啓動並與CM運行。 shell視圖包含多個ContentControl,它本身包含視圖。這些按慣例分配,因爲它們的名稱與視圖模型中的屬性匹配。Caliburn.Micro新窗口不遵循約定

我得到了一個WPF窗口(至少它的類繼承自Window),它是從我的應用程序打開的windowManager.ShowDialog(viewModel)。再次在這個窗口中,我有ContentControls,但這些不綁定到視圖模型屬性。

我已經試圖在窗口上設置cal:View.ApplyConventions="True"但這也沒有幫助。我也使用ViewModelBinder.Bind(viewmodel, view, null)綁定虛擬機和查看窗口之前顯示 - 也不工作。

如何確保我打開的窗口(模態對話框)使用相同的CM增強功能?

這是視圖:

<Window x:Class="Client.Views.History.HistoryView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro" 
    Title="Historie" Height="300" Width="300" 
        cal:View.ApplyConventions="True" 
    > 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="64" /> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="20" /> 
    </Grid.RowDefinitions> 
    <ContentControl x:Name="HeaderView" Grid.Row="0" Grid.Column="0" /> 
    <ContentControl x:Name="RecordView" Grid.Row="1" Grid.Column="0" /> 
    <Border Grid.Row="2" Grid.Column="0" Background="DarkKhaki" BorderThickness="2" BorderBrush="DarkSeaGreen" /> 
</Grid> 
</Window> 

這樣的觀點被加載顯示邊框。 DataContext應該由caliburn micro設置。這是視圖模型:

public class HistoryViewModel : PropertyChangedBase 
{ 

    #region Fields -------------------------------------------------------- 

    private readonly HeaderViewModel headerView; 
    private readonly RecordViewModel recordView; 

    #endregion 

    public HistoryViewModel() 
    { 
     this.headerView = IoC.Get<HeaderViewModel>(); 
     this.recordView = IoC.Get<RecordViewModel>(); 
    } 

    public HeaderViewModel HeaderView 
    { 
     get { return this.headerView; } 
    } 

    public RecordViewModel RecordView 
    { 
     get { return this.recordView; } 
    } 
} 

構造函數運行,視圖模型創建(NOT NULL)。但是從不訪問屬性HeaderViewRecordView

要啓動這個我用這個代碼:

HistoryViewModel viewModel = IoC.Get<HistoryViewModel>(); 
windowManager.ShowDialog(viewModel); 

明確地結合當模特這樣它的工作原理:

<ContentControl x:Name="HeaderView" cal:View.Model="{Binding HeaderView}" Grid.Row="0" Grid.Column="0" /> 
<ContentControl x:Name="RecordView" cal:View.Model="{Binding RecordView}" Grid.Row="1" Grid.Column="0" /> 

但我想知道怎麼標準mechaniscs可以重新啓用。

+0

這可能有助於看到一些代碼。 DataContext是否在窗口本身是正確的,並且預期的視圖是否至少可以正確顯示? – Chris

+0

@Chris我加了一些代碼。是顯示窗口的視圖 - 只是其ContentControls的內容而已。 – ZoolWay

回答

1

我認爲您的HistoryViewModel需要成爲導體才能使其工作。既然你希望兩個子虛擬機同時顯示,你可以從Conductor.Collection.AllActive繼承。

約翰

+0

如果是這樣的話,爲什麼我不必爲'ShellViewModel'(意味着應用程序啓動時的主視圖)做到這一點? – ZoolWay

+0

你的'ShellViewModel'是從哪裏繼承的? = o – Chris

+0

@ZoolWay:因爲ShellViewModel是由Bootstrapper直接調用的,它會將它打開的任何虛擬機看作是Conductor。有關此行爲的說明,請參閱http://caliburnmicro.com/documentation/composition。 – jbiddle