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獲取本地類型,而不使用此屬性?
在上面的例子中,我使用了一個空的ContentControl,並通過datatriggers插入模板。所以我不清楚的是:如何將這個數據模板插入到列表框樣式中? – deafjeff 2013-05-03 12:07:02
...此外,我不想編碼一個C#編碼的模板選擇器。那麼祕密是什麼? – deafjeff 2013-05-03 12:22:27
您不需要模板選擇器。每次WPF都必須顯示您的本地類中的一個,它將使用指定的DataTemplate。我不知道你的代碼,但在你的情況下,我假設你可以將ContentControl.Content綁定到'{Binding}',根據'this'的類型,它應該選擇正確的列表框DataTemplate。 – LPL 2013-05-03 14:38:19