将 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' 不是 Setter 上的 'System.Windows.Controls.Control.Template' 属性的有效值。
我必须在运行时加载触发器,因为它(triggerValue)来自动态加载的插件。如果我将 ControlTemplate 直接添加到 Setter 而不是将其作为 StaticResource 引用,它也可以正常工作,但我不喜欢在我可能需要它的每个页面/窗口上加载相同的 ControlTemplate 的想法。
如果我从后面的代码中添加资源,我知道如何让 DataTrigger 中的 Setter 引用资源吗?