

Windows10、Visual Studio 2017、.NET Framework
4.5で、以下のようなDataTemplateSelectorを作成しました。

[code]

    [ContentProperty("DataTemplateTable")]
    public class TypeToDataTemplateSelector : DataTemplateSelector
    {
        public TypeToDataTemplateDictionary DataTemplateTable { get; set; }
    
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            // DataTemplateTableからDataTemplateを取得する処理
        }
    }
    
    public class TypeToDataTemplateDictionary : Dictionary<Type, DataTemplate> { }
    
[/code]

以下のコードでは、問題なく動作していました。

[code]

    <local:TypeToDataTemplateSelector x:Key="TypeToDataTemplateSelector">
        <local:TypeToDataTemplateDictionary>
            <DataTemplate x:Key="{x:Type local:ViewModelA}" DataType="local:ViewModelB">
                <TextBlock Text="ViewModelA"/>
            </DataTemplate>
            <DataTemplate x:Key="{x:Type local:ViewModelB}" DataType="local:ViewModelB">
                <TextBlock Text="ViewModelB"/>
            </DataTemplate>
            <DataTemplate x:Key="{x:Type local:ViewModelC}" DataType="local:ViewModelC">
                <TextBlock Text="ViewModelC"/>
            </DataTemplate>
        </local:TypeToDataTemplateDictionary>
    </local:TypeToDataTemplateSelector>
    
[/code]

しかし、StaticResourceを使用したときに問題が発生しました。

[code]

    <DataTemplate x:Key="DataTemplateA" DataType="local:ViewModelA">
        <TextBlock Text="ViewModelA"/>
    </DataTemplate>
    <DataTemplate x:Key="DataTemplateB" DataType="local:ViewModelB">
        <TextBlock Text="ViewModelB"/>
    </DataTemplate>
    <DataTemplate x:Key="DataTemplateC" DataType="local:ViewModelC">
        <TextBlock Text="ViewModelC"/>
    </DataTemplate>
    <local:TypeToDataTemplateSelector x:Key="TypeToDataTemplateSelector">
        <local:TypeToDataTemplateDictionary>
            <StaticResource x:Key="{x:Type local:ViewModelA}" ResourceKey="DataTemplateA"/>
            <StaticResource x:Key="{x:Type local:ViewModelB}" ResourceKey="DataTemplateB"/>
            <StaticResource x:Key="{x:Type local:ViewModelC}" ResourceKey="DataTemplateC"/>
        </local:TypeToDataTemplateDictionary>
    </local:TypeToDataTemplateSelector>
    
[/code]

ビルドは通るのですが、実行時に`XamlObjectWriterException: ''StaticResourceHolder'
オブジェクトにキー値がありません。' 行番号 'xx'、行位置 'xx'。`と例外が発生してしまいます。

これをどうにかして回避し、DictionaryにStaticResourceを使うことはできないでしょうか。


CC BY-SA 4.0
2018-11-01T13:46:50.803
49867
2018-11-03T09:05:33.947
2018-11-03T09:05:33.947
70
70
question
c# wpf
XAML上のDictionaryにStaticResourceを使う方法


単に"{x:Type local:ViewModelA}"がキー値として使えないってことじゃないですか？


CC BY-SA 4.0
2018-11-03T02:24:28.763
49914
2018-11-03T02:24:28.763
18616
49867
answer