У меня проблема при динамическом добавлении 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 ссылаться на ресурс, если я добавлю его из кода?