2011-04-27 60 views
4

我正在使用Expression Blend的「示例數據來自類」功能爲我的MVVM WPF項目中的ViewModels生成示例數據。雖然這在大多數情況下都能正常工作,但當我使用ContentPresenter呈現視圖模型時,它似乎失敗了,並且它應該使用的DataTemplate沒有Key,但只有一個DataType。 而不是使用模板呈現示例數據,它只是顯示具有前綴的類名稱。Expression Blend示例數據和數據模板

舉個例子,藉此視圖模型

public class TestClass 
{ 
    public string TestString { get; set; } 
} 

這個DataTemplate中

<DataTemplate DataType="{x:Type my:TestClass}" > 
    <TextBlock Text="{Binding TestString}" /> 
</DataTemplate> 

這XAML

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

現在,在運行時,一切都在它應該的,但在設計過程中Blend顯示「_di0.MyNameSpace.TestClass」而不是TestString的內容。 我假設,這是因爲樣本數據函數生成的類,雖然具有相同的屬性等,但並不是真正需要的類型。有沒有辦法解決這個問題?我寧願使用這種方式來整合示例數據,而不是在我的實際視圖模型中包含所有這些無意義的數據。

回答

0

可能的解決方法是使用DataTemplateSelector,它根據類名稱而不是它們的類型來選擇模板。

改變的DataTemplate到

<DataTemplate x:Key="TestClassTemplate" DataType="{x:Type my:TestClass}" > 
    <TextBlock Text="{Binding TestString}" /> 
</DataTemplate> 

創建DataTemplateSelector

public class TestTemplateSelector : DataTemplateSelector 
{ 

    public override DataTemplate SelectTemplate(
             object item, 
             DependencyObject container) 
    { 
     FrameworkElement element = container as FrameworkElement; 

     if (element == null || item == null) 
      return null; 

     if (item.GetType().Name.Contains("TestClass")) 
      return element.FindResource("TestClassTemplate") as DataTemplate; 

     // Check for other classes here... 

     return null; 
    } 
} 

,並使用它像

<!-- in ressources --> 
<local:TestTemplateSelector x:Key="TestTemplateSelector" /> 

<ContentPresenter Content="{Binding MyPropertyContainingATestClass}" 
        ContentTemplateSelector="{StaticResource TestTemplateSelector}" /> 

作品。

我對這種方法並不滿意,因爲這是很多不必要的工作,並且依賴於魔法字符串,但它總比沒有好。

1

我認爲問題是你有一個DataTemplate而不是一個ContentTemplate。嘗試將DataTemplate包裝在ContentTemplate中,如本文所示: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol.contenttemplate.aspx

對於沒有時間測試它,我表示歉意。

+0

感謝您的回覆。不過,鏈接的文章並未解決我的情況。我希望避免在Presenter上設置ContentTemplate。當我爲不同類型使用不同的DataTemplates時,ContentPresenter在運行時自動選擇正確的一個。請參閱http://msdn.microsoft.com/en-us/library/ms742521.aspx#Styling_DataType – Jens 2011-04-28 06:41:55