1

将 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 引用资源吗?

4

1 回答 1

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);
于 2013-06-24T12:59:18.657 回答