現在の DataContext に基づいて設定したい Content を含む基本アセンブリにコントロールがあります。
そのために、以下に示すように、呼び出し元のアセンブリでリソースとサブクラス化された DataTemplateSelector を使用しようとしています。私の最初の希望は、サブクラス化された DataTemplateSelector が呼び出されることでしたが、そうではありません。次に、呼び出し元のアセンブリのリソース ディクショナリにエントリを追加しようとしましたが、キーは同じですが、サブクラスのセレクタがありましたが、それもできませんでした。
これを機能させるために必要なコードを修正する方法はありますか? 呼び出し元のアセンブリからコンテンツを設定するためのより良い戦略はありますか?
乾杯、
ベリル
ユーザー コントロール (ベース アセンブリ)
<UserControl
...
<Grid>
<Border Style="{StaticResource FilterPanelBorderStyle}">
<StackPanel Orientation="Horizontal" x:Name="myFilterPanel" >
***** <ContentControl x:Name="ctrlFilters" ContentTemplateSelector="{StaticResource filterControlsTemplateSelector}" /> ****
<Button x:Name="btnClearFilter" Style="{StaticResource FilterPanelClearButtonStyle}" />
<Label x:Name="lblStatus" Style="{StaticResource FilterPanelLabelStyle}" Content="{Binding Status}" />
</StackPanel>
</Border>
</Grid>
</UserControl>
リソースと DataTemplateSelector (ベース アセンブリ)
<views:FilterControlsTemplateSelector x:Key="filterControlsTemplateSelector"/>
<DataTemplate x:Key="defaultFilterContent">
<TextBlock>Replace ME with real filters!</TextBlock>
</DataTemplate>
public class FilterControlsTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var fe = container as FrameworkElement;
if (fe == null) return null;
return _GetDataTemplate(fe);
}
protected virtual DataTemplate _GetDataTemplate(FrameworkElement fe) {
var template = fe.FindResource("defaultFilterContent") as DataTemplate;
return template;
}
}
リソースとセレクター (アセンブリーの呼び出し)
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Core.Presentation.Wpf;component/Themes/Generic.xaml" />
</ResourceDictionary.MergedDictionaries>
<local:PimFilterControlsTemplateSelector x:Key="filterControlsTemplateSelector"/>
<DataTemplate x:Key="pimFilterContent">
<Grid>
<Border Style="{StaticResource FilterPanelBorderStyle}">
<StackPanel Orientation="Horizontal" >
<cc:SearchTextBox
x:Name="stbLastNameFilter" Style="{StaticResource FilterPanelSearchTextBoxStyle}"
/>
<cc:SearchTextBox
x:Name="stbFirstNameFilter" Style="{StaticResource FilterPanelSearchTextBoxStyle}"
/>
</StackPanel>
</Border>
</Grid>
</DataTemplate>
public class PimFilterControlsTemplateSelector : FilterControlsTemplateSelector
{
protected override DataTemplate _GetDataTemplate(FrameworkElement fe)
{
var dc = fe.DataContext;
if (dc == null) return null;
DataTemplate result = null;
if (dc is PimMasterVm)
{
result = fe.FindResource("pimFilterContent") as DataTemplate;
}
else {
result = base._GetDataTemplate(fe);
}
return result;
}
}
アプリケーション ディクショナリのセットアップ (アセンブリの呼び出し)
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Parties.Presentation.Wpf;component/PimCommonResources.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>