在向现有元素动态添加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'属性。
我必须在运行时加载Trigger,因为它(triggerValue)来自动态加载的插件。如果我将ControlTemplate直接添加到Setter而不是将其作为StaticResource引用它也可以正常工作但我不喜欢必须在我可能需要它的每个页面/窗口上加载相同的ControlTemplate。
如果我从Code后面添加它,我怎么能在DataTrigger中获取Setter来引用资源?
答案 0 :(得分:2)
您正在尝试将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);