2013-05-02 20 views
0

我經常使用依賴於本地類類型的觸發器。常見的情況是通用控件樣式,它們具有依賴於類的ContentControls。 場景:wpf在xaml觸發器中獲取對象類型

1),它實現一個列表框「的MyUserControl」

2)一個大的列表框式,適用於該用戶控件內的列表框控制一個用戶控件。樣式具有最初爲空的ContentControl中(即填充有標籤/ StackPanel中)

<ContentControl Name="SpecificLabel"></ContentControl> 

3)沒有關於每個特定的派生類

<ControlTemplate x:Key="listbox1Template"> 
    <Label... 
</ControlTemplate> 

<ControlTemplate x:Key="listbox2Template"> 
    <StackPanel... 
</ControlTemplate> 

4定義Contentcontrols)根據派生類的MyListboxControl,所述ContentControl中的模板由Datatriggers選自:

<DataTrigger Binding="{Binding ElementName=MyUserControl, Path=DataType}" Value="{x:Type local:MyListbox1}"> 
    <Setter TargetName="SpecificLabel" Property="Template" Value="{StaticResource listbox1template}"/> 
</DataTrigger> 

<DataTrigger Binding="{Binding ElementName=MyUserControl, Path=DataType}" Value="{x:Type local:MyListbox2}"> 
    <Setter TargetName="SpecificLabel" Property="Template" Value="{StaticResource listbox2template}"/> 
</DataTrigger> 

因此,基類提供了一個數據類型屬性:

public Type DataType 
{ 
    get 
    { 
     return this.GetType(); 
    } 
} 

這看起來必須有更簡單的方法。是否有可能僅使用XAML獲取本地類型,而不使用此屬性?

回答

1

我會用DataTemplate.DataType屬性讓WPF做這個工作。沒有觸發器,沒有額外的DataType屬性。

<DataTemplate DataType="{x:Type local:MyListbox1}"> 
    <Label... 
</DataTemplate> 
+0

在上面的例子中,我使用了一個空的ContentControl,並通過datatriggers插入模板。所以我不清楚的是:如何將這個數據模板插入到列表框樣式中? – deafjeff 2013-05-03 12:07:02

+0

...此外,我不想編碼一個C#編碼的模板選擇器。那麼祕密是什麼? – deafjeff 2013-05-03 12:22:27

+0

您不需要模板選擇器。每次WPF都必須顯示您的本地類中的一個,它將使用指定的DataTemplate。我不知道你的代碼,但在你的情況下,我假設你可以將ContentControl.Content綁定到'{Binding}',根據'this'的類型,它應該選擇正確的列表框DataTemplate。 – LPL 2013-05-03 14:38:19