2011-11-10 66 views
0

我有一个名为类:更改项目的模板

public class CountryTemplateSelector : ContentControl 
    { 
     public DataTemplate TrueTemplate 
     { 
      get; 
      set; 
      } 

     public DataTemplate FalseTemplate 
     { 
      get; 
      set; 
     } 



     public override DataTemplate SelectTemplate(object item, DependencyObject container) 
     { 
      Shopping_Ingredients itemAux = item as Shopping_Ingredients; 
      if (itemAux != null) 
      { 
       if (itemAux.IsMarked == true) 
        return TrueTemplate; 
       else 
        return FalseTemplate; 
      } 

      return base.SelectTemplate(item, container); 
     } 
public virtual DataTemplate SelectTemplate(object item, DependencyObject container) 
     { 
      return null; 
     } 

     protected override void OnContentChanged(object oldContent, object newContent) 
     { 
      base.OnContentChanged(oldContent, newContent); 

      ContentTemplate = SelectTemplate(newContent, this); 
     } 
    } 

和一个DataTemplate在App.xaml中声明:

<DataTemplate x:Key="SelectorForCheckbox"> 
      <local:CountryTemplateSelector Content="{Binding}"> 
       <local:CountryTemplateSelector.TrueTemplate> 
        <DataTemplate> 

         <StackPanel Orientation="Horizontal" Height="82"> 
          <CheckBox Name="cb1" FontSize="15" IsChecked="{Binding Path=IsMarked, Mode=TwoWay}" Margin="0,4" RenderTransformOrigin="0.485,0.365" VerticalContentAlignment="Bottom" /> 
          <TextBlock Text="{Binding AmountToString}" Margin="15,0,5,0" VerticalAlignment="Center" HorizontalAlignment="Left" FontSize="24"/> 

         </StackPanel> 
        </DataTemplate> 
       </local:CountryTemplateSelector.TrueTemplate> 
       <local:CountryTemplateSelector.FalseTemplate> 
        <DataTemplate> 

         <StackPanel Orientation="Horizontal" Height="82"> 
          <CheckBox Name="cb1" FontSize="15" IsChecked="{Binding Path=IsMarked, Mode=TwoWay}" Margin="0,4" RenderTransformOrigin="0.485,0.365" VerticalContentAlignment="Bottom" /> 
          <TextBlock Text="TEST" Margin="15,0,5,0" VerticalAlignment="Center" HorizontalAlignment="Left" FontSize="24"/> 

         </StackPanel> 
        </DataTemplate> 
       </local:CountryTemplateSelector.FalseTemplate> 
      </local:CountryTemplateSelector> 
     </DataTemplate> 

和LongListSelector:

<toolkit:LongListSelector x:Name="recipe1" Background="Transparent" 
       ItemTemplate="{StaticResource SelectorForCheckbox}" 
        ListHeaderTemplate="{StaticResource citiesListHeader}" 
         ListFooterTemplate="{StaticResource citiesListFooter}" 
        GroupHeaderTemplate="{StaticResource groupHeaderTemplate}" 
        GroupItemTemplate="{StaticResource groupItemTemplate}" > 
        <toolkit:LongListSelector.GroupItemsPanel> 
         <ItemsPanelTemplate> 
          <toolkit:WrapPanel/> 
         </ItemsPanelTemplate> 
        </toolkit:LongListSelector.GroupItemsPanel> 
       </toolkit:LongListSelector> 

LongListSelector启动ok,模板显示ok。问题是我希望能够更改点击特定项目的模板。我怎么能这样做?

回答

0

我们应该能够在代码中设置模板。看到这个StackOverflow question。确保所有需要的模板都是App.xaml或特定UserControl中的资源。我的例子是从一个按钮点击,但同样的方法应该适用于其他地方的代码。我不是100%确定它应该投射到ControlTemplate。它可能会非常符合每个模板。

public void CLick_Method(object sender, RoutedEventArgs e) 
{ 
this.recipe1.ItemTemplate = (ControlTemplate)Resources["SelectorForX"]; 
this.recipe1.ListHeaderTemplate= (ControlTemplate)Resources["NewListHeaderTemplate"]; 
// etc. 
} 
+0

tnx for the response!事情是,我想只改变点击特定项目的模板! (例如,一旦项目被点击,我想有一个绿色的背景)。其他项目应具有初始模板分配 – Alex