2011-01-18 47 views
0

我目前陷入了一個問題,通過轉換器將不同的模板分配給控件。如何從轉換器引用xaml模板?

所以我有2個模板。

 <ControlTemplate x:Name="_templateA" x:Key="templateA"> 
      <StackPanel Grid.Column="0" Margin="0,0,5,0"> 
       <Blah /> 
      </StackPanel> 
     </ControlTemplate> 

     <ControlTemplate x:Name="_templateB" x:Key="templateB"> 
      <StackPanel Grid.Column="0" Margin="0,0,5,0"> 
       <Blah Blah /> 
      </StackPanel> 
     </ControlTemplate> 

,我必須使用該轉換器這個控制:

<ControlA x:Name="_controlA" > 
    <Control Template="{Binding Converter={StaticResource templateConverters}}" /> 
</ControlA> 

我的轉換器:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     Object a; 
     ControlTemplate template = null; 

     try 
     { 
      a= value as ObjectA; 
      if (value != null) 
       template = a.useTemplate1 ? [templateA from xaml] : [templateB from xaml]; 
     } 
     catch (Exception ex) 
     { 
      Debug.Assert(false, ex.ToString()); 
     } 

     return toolbar; 
    } 

在我的轉換器,我怎麼能得到參考我的XAML文件,以便它允許我將它分配給我想要的模板?

感謝和問候, 千電子伏

+0

太多的問號。 – 2011-01-18 20:47:23

回答

10

也許你應該考慮在其他一些實施但這裏是你問的:

您的轉換代碼:

public class MyConverter : IValueConverter 
{ 
    public ControlTemplate TemplateA { get; set; } 
    public ControlTemplate TemplateB { get; set; } 

    ... Convert methods using TemplateA and TemplateB properties... 
} 

使用XAML中:

<UserControl.Resources> 
    <!-- templates with 'templateA' and 'templateB' keys --> 
    <Converters:MyConverter x:Key="templateConverters" TemplateA="{StaticResource templateA}" TemplateB="{StaticResource templateB}" /> 
<UserControl.Resources> 

... 

<ControlA x:Name="_controlA" > 
    <Control Template="{Binding Converter={StaticResource templateConverters}}" /> 
</ControlA> 
+0

感謝這工作。我想嘗試使用其他用戶所建議的數據觸發器,但我需要弄清楚如何才能正常工作。非常感謝。 – Kev84 2011-01-18 21:17:52

0

把你的模板在一些控制的資源,讓他們X:鍵和撥打:

ControlTemplate template = someControl.FindResource("Key") as ControlTemplate; 
0

我認爲你可以DataTriggers更好地做到這一點:

<ControlTemplate> 
     <StackPanel Name="TemplateA" Grid.Column="0" Margin="0,0,5,0"> 
      <Blah /> 
     </StackPanel> 
     <StackPanel Name="TemplateB" Grid.Column="0" Margin="0,0,5,0"> 
      <Blah Blah /> 
     </StackPanel> 

     <ControlTemplate.Triggers> 
     <DataTrigger Binding="{Binding YourProp}" Value="1"> 
      <Setter TargetName="TemplateA" Property="Visibility" Value="Visible" /> 
      <Setter TargetName="TemplateB" Property="Visibility" Value="Collapsed" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding YourProp}" Value="0"> 
      <Setter TargetName="TemplateA" Property="Visibility" Value="Collapsed" /> 
      <Setter TargetName="TemplateB" Property="Visibility" Value="Visible" /> 
     </DataTrigger> 
     </ControlTemplate.Triggers> 

    </ControlTemplate> 

這是從我的頭頂,這樣的TargetName可能是SOURCENAME等

+0

謝謝,雖然我無法使用觸發器工作,但可能我沒有實現它。 「價值」是如何與綁定的價值進行比較的,如果匹配,它會使用特定的一組代碼? – Kev84 2011-01-18 21:19:26

+0

你的價值是什麼類型?當值匹配時它將執行Setter組。根據你的價值的類型,可能會有一些不可思議的情況。 – jonathanpeppers 2011-01-18 22:40:39

1

你正在嘗試完成被稱爲模板選擇。例如,您可以在此閱讀:http://codingbandit.com/Blog/blog/wpf-data-templates-part-4-template-selectors/

鑑於此,您將定義一個模板選擇器(請參閱控件上的ContentTemplateSelector屬性)。而其SelectTemplate方法會是這個樣子:

public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container) 
{ 
    ControlTemplate template = null; 
    ContentPresenter pres = container as ContentPresenter; 

    try 
    { 
     if (value != null) 
      template = item.useTemplate1 ? pres.FindResource("_templateA") : pres.FindResource("_templateB"); 
    } 
    catch (Exception ex) 
    { 
     Debug.Assert(false, ex.ToString()); 
    } 

    return toolbar; 
} 

更新: 對不起,我忽略了你想獲得一個控件模板,而模板選擇是選擇一個DataTemplate。但我相信你的任務也可以通過使用數據模板來實現。

如果你仍然想使用控件模板然後觸發是要走的路:

<ControlTemplate x:Name="_templateA" x:Key="templateA"> 
    <StackPanel Grid.Column="0" Margin="0,0,5,0"> 
     <Blah /> 
    </StackPanel> 
</ControlTemplate> 

<ControlTemplate x:Name="_templateB" x:Key="templateB"> 
    <StackPanel Grid.Column="0" Margin="0,0,5,0"> 
     <Blah Blah /> 
    </StackPanel> 
</ControlTemplate> 

<Style x:Key="MyControlStyle" TargetType="[x:Type Control}"> 
    <Setter Property="Template" Value="{StaticResource templateB}"/> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding useTemplate1}" Value="True"> 
      <Setter Property="Template" Value="{StaticResource templateA}"/> 
     <DataTrigger/> 
    </Style.Triggers> 
</Style> 

你控制:

<ControlA x:Name="_controlA" > 
    <Control Style="{StaticResource MyControlStyle}" /> 
</ControlA>