2012-10-09 111 views
4

XAML中的DataTemplate可以與嵌套類關聯嗎?DataTemplate可以綁定到嵌套類嗎?

我正在處理MVVM應用程序,並且遇到了數據模板問題。我有一個視圖模型,爲項目控件提供了其他視圖模型的集合。這些項目是在外部視圖模型中定義爲嵌套類的層次結構的一部分。到目前爲止,我一直無法在XAML中創建映射來引用內部嵌套類。

這裏是類層次結構(簡化爲簡潔起見):

public class MainViewModel 
{ 
    public class A 
    { 
    } 

    public class B : A 
    { 
    } 

    public class C : A 
    { 
    } 

    public ObservableCollection<A> Items 
    { 
     get; 
     set; 
    } 
} 

在XAML中,我試圖映射一個DataTemplate,以B型和C,但我不能完全限定嵌套類的名稱。

<ItemsControl ItemsSource="{Binding Path=Items}"> 
    <ItemsControl.Resources> 
     <DataTemplate DataType="{x:Type ns:BracingViewModel.B}"> 
      <Grid> 
      .... 
      </Grid> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type ns:BracingViewModel.C}"> 
      <Grid> 
      .... 
      </Grid> 
     </DataTemplate> 
    </ItemsControl.Resources> 
</ItemsControl> 

問題:對嵌套類的引用顯示爲XAML中的構建錯誤。我得到如下:

Error 5 Cannot find the type 'ns:B'. Note that type names are case sensitive. Line... 

Error 5 Cannot find the type 'ns:C'. Note that type names are case sensitive. Line... 

如果我移動A,B,C類層次的MainViewModel類(即命名空間級別)之外,這工作正常。

按照一般的習慣,我儘量保持相關被定義爲在其內嵌套類視圖模型類,但是這使我這個問題。

所以,我的問題:是它甚至有可能到一個DataTemplate與嵌套類關聯?如果是這樣,XAML部分的工作如何?

在此先感謝... 喬

回答

17

這個工作對我來說:

<ItemsControl ItemsSource="{Binding Path=Items}"> 
     <ItemsControl.Resources> 
      <DataTemplate DataType="{x:Type ns:MainViewModel+B}"> 
       <Grid Background="Blue" 
         Width="30" 
         Height="30"> 

       </Grid> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type ns:MainViewModel+C}"> 
       <Grid Background="Chartreuse" Width="30" Height="30"> 

       </Grid> 
      </DataTemplate> 
     </ItemsControl.Resources> 
    </ItemsControl> 

換句話說,只是改變.+x:Type標記擴展

信用: this thread

+0

工程就像一個魅力,但我馬上遇到的問題VS2010與WPF DESIG在使用時不能顯示錶格。但是,綁定確實工作正常。 –

+0

如何對上帝的地球是任何人的預期要弄清楚這個語法?應該有一項禁止微軟設計和實施API的法律。 –