2012-12-10 60 views

回答

7

取決於。

我認爲你的主要問題是ContentPresenter只在控制模板中使用。你不能把它粘在一個窗口中,並期望它顯示窗口的內容。我相信你真的需要做的是使用ContentControl託管你的用戶界面。

通過將模型綁定到此控件的Content屬性,可以設置包含該模型的預期視圖的DataTemplates。我會給你一個簡短的例子。請注意,這可能與您的設計不符,但它展示了它們如何結合在一起。首先,對於每個視圖,創建一個管理該視圖的數據(和交互)的Model(或ViewModel)。

public sealed class Dialog : INotifyPropertyChanged // or DependencyObject 
{ 
    public string Input {get;set;} // INPC or DP implementation not shown 
    public ICommand Cancel {get;set;} 
    // class definition not shown 
} 

接下來,定義你的瀏覽在ContentPresenter顯示

<UserControl x:Class="Herp.DialogView" 
    HideImplementationDetails="true"> 
    <Border BorderBrush="Red" BorderThickness="5"> 
     <TextBlock Text="{Binding Input}" /> 
     <Button Command="{Binding Cancel}">Cancel</Button> 
     <!-- etc etc -->  
    </Border> 
</UserControl> 

接下來,在你的窗口中添加ContentControl中和的DataTemplate

<Window HideImplementationDetailsForBrevityOfXaml="true"> 
    <Window.Resources> 
     <DataTemplate xmlns:t="clr-namespace:Herp" 
      DataType="{x:Type t:Dialog}"> 
      <t:DialogView /> 
     </DataTempalte> 
    </Window.Resources> 
    <ContentControl Content="{Binding}" /> 
</Window> 

最後設置的DataContext的窗口到您的Dialog模型。

public MyWindow() 
{ 
    InitializeComponent(); 
    DataContext = new Dialog(); 
} 

這是怎樣的邏輯流程:創建

  1. 你的窗口。
  2. 對話框控件的一個實例在DataContext上設置。
  3. 在ContentControl中的綁定更新
  4. 默認的ContentControl搜索資源DataTemplateSelectorDataTemplateDataType設置爲typeof(Dialog)
  5. 它發現窗口的資源在這個DataTemplate中
  6. 的DataTemplate中的內容是loaded並添加爲的ContentControl

視覺孩子在任何時間的0 更改,重複相同的過程。因此,您可以擁有許多不同的模型,每個模型都包含一個不同的包含不同UserControl的DataTemplate,並且每次更新ContentControl上的綁定時都會看到期望的View。使用MVVM,您可以將ViewModel的屬性綁定到Content屬性(稱爲Current或某物),然後根據ViewModel的當前狀態將屬性中的模型切換爲期望值。請注意,在ContentControl中,設置爲Content屬性的任何內容都將成爲ContentControl的直接子節點的DataContext。類似於ItemsControl中的每個ItemsSourceItemTemplate中定義的可視樹的DataContext

1

我隱藏了很多關於OK和Cancel的view-viewmodel交互方面的細節,但只要你有一個DataTemplate設置,那麼這應該使你的視圖在窗口內呈現。

我在我的應用程序的資源字典中定義我的視圖模型視圖的DataTemplates:

<DataTemplate DataType="{x:Type SaveDocumentChangesVM}"> 
    <SaveDocumentChangesView /> 
</DataTemplate> 

窗口以主視圖:

<Window x:Class="CustomDialogWindow" 
     SizeToContent="WidthAndHeight" ShowInTaskbar="False"> 
    <ContentPresenter Name="DialogContentPresenter" /> 
</Window> 

的構造函數窗口:

public CustomDialogWindow(object viewModel, string dialogTitle) 
{ 
    InitializeComponent(); 

    // A datatemplate will allow WPF to figure out how to render the window contents 
    DialogContentPresenter.Content = viewModel; 

    if (dialogTitle != null) 
    { 
     Title = dialogTitle; 
    } 
} 

顯示如下對話框:

var vm = new SaveDocumentChangesVM(); 
var dialog = new CustomDialogWindow(vm, "This is my dialog"); 
dialog.ShowDialog(); 
相關問題