StaticResource MyTemplate не является допустимым значением для свойства System.Windows.Controls.Control.Template в Setter

У меня проблема при динамическом добавлении DataTrigger к существующему элементу.

Если я жестко запрограммирую его в MainWindow.XAML, как это, он отлично работает:

В App.Xaml:

...
<Application.Resources>
    <ControlTemplate x:Key="MyTemplate">
        <TextBox AcceptsReturn="True" AcceptsTab="True" AllowDrop="True" Text="{Binding Content}"/>
    </ControlTemplate>
</Application.Resources>
...

В MainWindow.XAML:

...
<DataTemplate>
    <Control x:Name="ViewPlaceHolder" Template="{StaticResource ViewPlaceHolderTemplate}" />
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding TypeName}" Value="MyViewModelName">
            <Setter TargetName="ViewPlaceHolder" Property="Template" Value="{StaticResource MyTemplate}" />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>
...

Но если я создам DataTrigger в следующем коде:

...
    DataTrigger tr = new DataTrigger();
    Binding b = new Binding();
    b.Path = new PropertyPath("TypeName");
    tr.Value = triggerValue;
    tr.Binding = b;
    Setter st = new Setter(Control.TemplateProperty, "{StaticResource MyTemplate}");
    st.TargetName = "ViewPlaceHolder";
    tr.Setters.Add(st);
    myDataTemplate.Triggers.Add(tr);
...

Во время привязки я получаю следующую ошибку (когда я добавляю триггер в шаблон, а использование XamlWriter.Write (myDataTemplate) показывает, что он правильно добавлен в DataTemplate), ошибки не возникает):

StaticResource MyTemplate не является допустимым значением для свойства System.Windows.Controls.Control.Template в Setter.

Мне нужно загрузить триггер во время выполнения, потому что он (triggerValue) исходит из динамически загружаемого плагина. Если я добавлю ControlTemplate непосредственно в Setter вместо того, чтобы ссылаться на него как на StaticResource, он также будет работать нормально, но мне не нравится идея загружать один и тот же ControlTemplate на каждой странице / окне, где он мне может понадобиться.

Любая идея о том, как я могу заставить Setter в DataTrigger ссылаться на ресурс, если я добавлю его из кода?


person Danie Brink    schedule 24.06.2013    source источник


Ответы (1)


Вы пытаетесь установить в качестве значения свойства Template фактическую буквальную строку "{StaticResource MyTemplate}".

Вам нужно найти экземпляр ресурса, используя что-то вроде этого:

var myTemplate = Application.Current.TryFindResource("MyTemplate") as ControlTemplate;
// Do something appropriate if myTemplate is null
Setter st = new Setter(Control.TemplateProperty, myTemplate);
person Dutts    schedule 24.06.2013
comment
@DanieBrink Никаких проблем, рад помочь. Не могли бы вы отметить это как ответ, если это решит вашу проблему? - person Dutts; 24.06.2013