2011-03-21 34 views
1

我有一個DataTemplate它的數據類型是MyViewModel,如果我這樣做:Window.Content用的DataTemplate

<ContentPresenter Content="{Binding SomeViewModel}"/> 

,如果我設置了「SomeViewModel」是MyViewModel(虛擬機,在DataTemplate中定義) ,我可以看到預期的視圖上的DataTemplate呈現。

我想要做的是這樣的:

Window host = new Window() 
host.Content = new MyViewModel(); 
host.Show(); 

我希望這顯示出與呈現上,與MyViewModel相關的DataTemplate中的窗口,而不是我得到一個單行的窗口,路徑到我的ViewModel。

我做錯了什麼?

+0

也許你有一個'DataTemplate'定義在錯誤的地方。向我們展示一個'DataTemplate'定義。 – Snowbear 2011-03-21 20:18:29

回答

4

可能是資源位置問題。以前定義的DataTemplate在哪裏?是否在App.xaml的ResourceDictionary中?嘗試在那裏添加DataTemplate

<Application ...> 
    <Application.Resources> 
     <DataTemplate DataType="{x:Type MyViewModel}"> 
      <!-- View --> 
     </DataTemplate> 
    </Application.Resources> 
</Application> 

更好的情況是,你會放這是在App.xaml合併與他人ResourceDictionary

編輯:微小的工作示例。

<Application x:Class="DataTemplateTest.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     Startup="Application_Startup"> 
    <Application.Resources> 
     <DataTemplate DataType="{x:Type sys:Int32}"> 
      <Border Background="Red"> 
       <TextBlock Text="{Binding}" /> 
      </Border> 
     </DataTemplate> 
    </Application.Resources> 
</Application> 

相應的代碼隱藏:

public partial class App : Application 
{ 
    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     var window = new Window(); 
     window.Content = 42; 
     window.Show(); 
    } 
} 

編輯2:既然你說這個代碼是在一個WPF外接程序

  1. 如果DataTemplate是在宿主應用程序,這是行不通的。主機和AddIn用戶界面不以這種方式相互通話,因爲AddIn僅僅是HwndSource
  2. 如果DataTemplate是在外接程序一個ResourceDictionary,就可以加載它像這樣:

    var window = new Window(); 
    window.Resources.MergedDictionaries.Add(
        new ResourceDictionary 
        { 
         Source = 
          new Uri("pack://application:,,,/AddInAssembly;component/Resources.xaml", 
            UriKind.Relative) 
        }); 
    window.Content = ...; 
    window.Show(); 
    
+0

@sixlettervariables,似乎不像,因爲在ContentPresenter的情況下,它的作品 – Pacman 2011-03-21 20:32:56

+1

我經常使用這種方法知道它的工作原理,也許你可以發佈更多的代碼?我的直覺說'DataTemplate'資源不在'Window'所能找到的'ResourceDictionary'中。 – user7116 2011-03-21 20:36:15

+0

我沒有app.xaml,這是一個AddIn,Application.Current返回null的一部分。另外,正如我所提到的,我的ContentPresenter綁定到了我試圖在Window.Content中顯示的同一個VM,但是當我使用相同的屬性將其作爲window.Content的一部分啓動時,它失敗了。 – Pacman 2011-03-21 20:51:40

0

你應該將以下信息添加到你的問題:哪裏是定義的DataTemplate /用戶控件( addin.dll)? 「窗口」在哪裏定義(mainproject)?

如果您的viewmodel和datatemplate在您的addin.dll中,並且您的「窗口」位於您的主項目中,那麼您至少必須將數據模板作爲資源添加到窗口中。

如果你的viewmodel和datatemplate和你的「窗口」在你的addin.dll中,你只需要調用你的主項目「window.show」,那麼你必須添加數據模板作爲資源到你的「窗口」 addin.dll。

我使用MEF FO構建WPF應用程序的插件,我用我的addin.dlls的語法如下:

<ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/YourAddinDllName;Component/ResourceDictionary.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 

順便說一句,如果你暴露只是你的視圖模型,並把它在你的mainproject。你也必須公開並註冊你的數據模板。讓我知道你的插件是如何工作的。