2013-06-24 52 views
1

動態地將DataTrigger添加到現有元素時遇到問題。'靜態資源MyTemplate'不是Setter上'System.Windows.Controls.Control.Template'屬性的有效值

如果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正確):

「靜態資源MyTemplate的」對於Setter上的 'System.Windows.Controls.Control.Template'屬性不是有效值。

我必須在運行時加載觸發器,因爲它(triggerValue)來自動態加載的插件。如果我將ControlTemplate直接添加到Setter而不是將其引用爲StaticResource,它也可以正常工作,但我不喜歡在每個需要它的頁面/窗口中加載相同的ControlTemplate的想法。

任何想法如何我可以讓DataTrigger中的Setter引用資源,如果我從代碼後面添加它?

回答

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); 
+0

非常好,謝謝:) –

+0

@DanieBrink完全沒有問題,樂意提供幫助。如果這能解決您的問題,您是否將此標記爲答案? – Dutts