2014-01-22 78 views
1

考慮以下模型:如何在特定位置禁用DataTemplate?

var model = new object[] { "Ala ma kota", DateTime.Now }; 

現在,讓我們假設,我們有列表框下面的DataTemplates顯示該模型:

<ListBox ItemsSource="{Binding Data}"> 
    <ListBox.Resources> 
     <DataTemplate DataType="{x:Type sys:String}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock>String:</TextBlock> 
       <TextBlock Text="{Binding}" /> 
      </StackPanel> 
     </DataTemplate> 

     <DataTemplate DataType={x:Type sys:DateTime}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock>Data i czas:</TextBlock> 
       <Calendar DisplayDate={Binding Mode=OneWay}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.Resources> 
</ListBox> 

如果我們運行這樣的程序,頗爲滑稽的作用效果:

Too much styling

有沒有一種方法來禁用DataTemplate在某些層面上?我想在第二個DataTemplate中「阻止」它,以便日曆能夠正確顯示。

+0

按塊顯示你的意思? –

+0

@RohitVats我想告訴WPF在模板化DateTime類型的元素時不要爲'String'搜索'DataTemplate'。簡單地說:我希望「日曆」能夠正確顯示:) – Spook

+0

現在好了。看看我的答案,如果有幫助。 –

回答

1

我能想到的一種方式是利用WPF中的資源查找行爲。它遍歷Visual樹直到找到控件的默認資源。

  <DataTemplate DataType="{x:Type sys:DateTime}"> 
       <StackPanel Orientation="Horizontal"> 
        <StackPanel.Resources> 
         <DataTemplate DataType="{x:Type sys:String}"> 
          <TextBlock Text="{Binding}"/> 
         </DataTemplate> 
        </StackPanel.Resources> 
        <TextBlock>Data i czas:</TextBlock> 
        <Calendar DisplayDate="{Binding Mode=OneWay}" /> 
       </StackPanel> 
      </DataTemplate> 

輸出:

可以本地的內部日期時間的DataTemplate的字符串,使其獲取您的日期時間模板,併爲他人局部應用將繼續表現同樣定義資源enter image description here

+0

+1 - 解決效果。但是有沒有辦法解決這個問題?例如。告訴WPF「現在停止搜索數據模板並使用默認值」?就像將'Style'設置爲'{x:Null}'一樣,將任何控件的外觀恢復爲默認的控件。 – Spook

+0

我沒有任何其他的方式來實現這一點(根據我的知識當然)。 –