2016-05-17 43 views
1

我有一个GridView,它使用了DataTemplateSelector。当DataTemplateSelector设置在GridView像这样它工作正常:与ItemContainerStyle一起使用DataTemplateSelector

 <GridView x:Name="PayeesGridView" 
        IsItemClickEnabled="True" 
        ItemTemplateSelector="{StaticResource PayeeTemplateSelector}" 
        ItemsSource="{Binding FilteredPayees, 
             Mode=OneWay}" 
        Padding="5" 
        SelectionMode="None"> 

      <interactivity:Interaction.Behaviors> 
       <core:EventTriggerBehavior EventName="ItemClick"> 
        <core:CallMethodAction MethodName="GridViewItemClick" TargetObject="{Binding Mode=OneWay}" /> 
       </core:EventTriggerBehavior> 
      </interactivity:Interaction.Behaviors> 
      <GridView.ItemsPanel> 
       <ItemsPanelTemplate> 
        <ItemsWrapGrid x:Name="ItemWrapGrid" /> 
       </ItemsPanelTemplate> 
      </GridView.ItemsPanel> 

      <GridView.ItemContainerStyle> 
       <Style TargetType="GridViewItem"> 
        <Setter Property="Margin" Value="5" /> 
       </Style> 
      </GridView.ItemContainerStyle> 
     </GridView> 

不过,我想设置ItemContainerStyle内的DataTemplate使我能够使用VisualStateManager。我想声明它是这样的:

 <GridView x:Name="PayeesGridView" 
        IsItemClickEnabled="True" 
        ItemsSource="{Binding FilteredPayees, 
             Mode=OneWay}" 
        Padding="5" 
        SelectionMode="None"> 

      <interactivity:Interaction.Behaviors> 
       <core:EventTriggerBehavior EventName="ItemClick"> 
        <core:CallMethodAction MethodName="GridViewItemClick" TargetObject="{Binding Mode=OneWay}" /> 
       </core:EventTriggerBehavior> 
      </interactivity:Interaction.Behaviors> 
      <GridView.ItemsPanel> 
       <ItemsPanelTemplate> 
        <ItemsWrapGrid x:Name="ItemWrapGrid" /> 
       </ItemsPanelTemplate> 
      </GridView.ItemsPanel> 

      <GridView.ItemContainerStyle> 
       <Style TargetType="GridViewItem"> 
        <Setter Property="Margin" Value="5" /> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="GridViewItem"> 
           <Grid> 
            <Grid.Background> 
             <SolidColorBrush x:Name="GridBackground" Color="Transparent" /> 
            </Grid.Background> 

            <VisualStateManager.VisualStateGroups> 
             <VisualStateGroup x:Name="CommonStates"> 
              <VisualState x:Name="Normal" /> 
              <VisualState x:Name="PointerOver"> 
               <VisualState.Setters> 
                <Setter Target="GridBackground.Color" Value="Green" /> 
               </VisualState.Setters> 
               <Storyboard /> 
              </VisualState> 
              <VisualState x:Name="Pressed"> 
               <VisualState.Setters> 
                <Setter Target="GridBackground.Color" Value="#36B536" /> 
               </VisualState.Setters> 
               <Storyboard /> 
              </VisualState> 
             </VisualStateGroup> 
            </VisualStateManager.VisualStateGroups> 

            <ContentPresenter Content="{TemplateBinding Content}" 
                 ContentTemplate="{TemplateBinding ContentTemplate}" 
                 ContentTemplateSelector="{StaticResource PayeeTemplateSelector}" /> 
           </Grid> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </GridView.ItemContainerStyle> 
     </GridView> 

使用ContentPresenter并指定ContentTemplateSelector以同样的方式为ItemTemplateSelector是在GridView。这样做,GridView只显示每个Payee的对象视图。 VisualStates正常工作,但它没有使用我定义的DataTemplate

DataTemplates都在Page.Resources定义,像这样:

<DataTemplate x:Key="OpenPayeeDataTemplate" x:DataType="models:Payee"> 
     <Grid> 
      <Border Width="230" 
        Height="230" 
        Background="White" 
        BorderBrush="#36B536" 
        BorderThickness="4"> 
       <Grid Margin="5,0,5,0"> 
        <Image Width="160" 
          Height="160" 
          Source="{x:Bind LogoBase64, Converter={StaticResource Base64StringToImageSourceConverter}}" /> 
        <TextBlock VerticalAlignment="Top" 
           FontSize="14" 
           FontWeight="Bold" 
           Foreground="Black" 
           Text="{x:Bind CompanyName}" 
           TextAlignment="Left" 
           TextWrapping="WrapWholeWords" /> 
        <TextBlock VerticalAlignment="Bottom" 
           FontSize="12" 
           FontWeight="Bold" 
           Foreground="Black" 
           Text="{x:Bind AccountNickname}" 
           TextAlignment="Right" 
           TextWrapping="WrapWholeWords" /> 
       </Grid> 
      </Border> 
     </Grid> 
    </DataTemplate> 
    <DataTemplate x:Key="ClosedPayeeDataTemplate" x:DataType="models:Payee"> 
     <Grid> 
      <Border Width="230" 
        Height="230" 
        Background="White" 
        BorderBrush="#36B536" 
        BorderThickness="4"> 
       <Grid Margin="5,0,5,0"> 
        <Image Width="160" 
          Height="160" 
          Source="{x:Bind LogoBase64, Converter={StaticResource Base64StringToImageSourceConverter}}" /> 
        <TextBlock VerticalAlignment="Top" 
           FontSize="14" 
           FontWeight="Bold" 
           Foreground="Black" 
           Text="{x:Bind CompanyName}" 
           TextAlignment="Left" 
           TextWrapping="WrapWholeWords" /> 
        <TextBlock VerticalAlignment="Bottom" 
           FontSize="12" 
           FontWeight="Bold" 
           Foreground="Black" 
           Text="{x:Bind AccountNickname}" 
           TextAlignment="Right" 
           TextWrapping="WrapWholeWords" /> 
       </Grid> 
      </Border> 
      <Border Width="230" 
        Height="230" 
        Background="Gray" 
        Opacity="0.75" /> 
     </Grid> 
    </DataTemplate> 
    <converters:PayeeDataTemplateSelector x:Name="PayeeTemplateSelector" 
              ClosedPayeeDataTemplate="{StaticResource ClosedPayeeDataTemplate}" 
              OpenPayeeDataTemplate="{StaticResource OpenPayeeDataTemplate}" /> 

另外,我曾尝试使用DataTemplate S的内部的VisualStateManager,但他们不会被触发,那么我就可以使用它外部DataTemplate,因此希望在ItemContainerStyle内使用ContentPresenter

我做了一些类似的一些ListViewItem s,但他们不使用DataTemplateSelector,所以我没有遇到同样的问题。有没有办法让VisualStateManagerDataTemplate之内工作,或者DataTemplateSelector能够在ContentPresenter之内工作?

编辑

这里是我试图把在Styles/DataTemplates.xaml的XAML。风格正在应用,但我没有得到任何VisualStates被触发。

<DataTemplate x:Key="PaymentTemplate"> 
    <UserControl> 
     <Grid> 
      <VisualStateManager.VisualStateGroups> 
       <VisualStateGroup x:Name="CommonStates"> 
        <VisualState x:Name="Normal" /> 
        <VisualState x:Name="PointerOver"> 
         <VisualState.Setters> 
          <Setter Target="GridItemOverlay.Background" Value="Green" /> 
         </VisualState.Setters> 
        </VisualState> 
       </VisualStateGroup> 
      </VisualStateManager.VisualStateGroups> 

      <Border Width="450" 
        Height="Auto" 
        Background="White" 
        BorderBrush="#36B536" 
        BorderThickness="4" 
        CornerRadius="5"> 

       <Grid Margin="10,5,10,5"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition /> 
         <ColumnDefinition /> 
        </Grid.ColumnDefinitions> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="34" /> 
         <RowDefinition /> 
         <RowDefinition /> 
         <RowDefinition /> 
        </Grid.RowDefinitions> 
        <TextBlock Grid.Row="0" 
           Grid.Column="0" 
           Grid.ColumnSpan="2" 
           FontSize="26" 
           FontWeight="Bold" 
           Foreground="Black" 
           Text="{Binding AccountName}" 
           TextAlignment="Left" 
           TextWrapping="WrapWholeWords" /> 
        <TextBlock Grid.Row="1" 
           Grid.Column="0" 
           Foreground="Black" 
           Text="{Binding Path=Description}" 
           TextAlignment="Left" /> 
        <TextBlock Grid.Row="1" 
           Grid.Column="1" 
           Foreground="Black"> 
         <Run Text="Payment Amount: " /> 
         <Run Text="{Binding Path=PaymentAmount, Converter={StaticResource StringFormatConverter}, ConverterParameter='{}{0:N}'}" /> 
        </TextBlock> 
        <TextBlock Grid.Row="2" 
           Grid.Column="1" 
           Foreground="Black"> 
         <Run Text="Principal Amount: " /> 
         <Run Text="{Binding Path=PrincipalAmount, Converter={StaticResource StringFormatConverter}, ConverterParameter='{}{0:N}'}" /> 
        </TextBlock> 
        <TextBlock Grid.Row="3" 
           Grid.Column="0" 
           Foreground="Black"> 
         <Run Text="Payment Date: " /> 
         <Run Text="{Binding PaymentDate, Converter={StaticResource StringFormatConverter}, ConverterParameter='{}{0:MM/dd/yyyy}'}" /> 
        </TextBlock> 
        <TextBlock Grid.Row="3" 
           Grid.Column="1" 
           Foreground="Black"> 
         <Run Text="Interest Amount: " /> 
         <Run Text="{Binding Path=InterestAmount, Converter={StaticResource StringFormatConverter}, ConverterParameter='{}{0:N}'}" /> 
        </TextBlock> 
       </Grid> 
      </Border> 
      <Border x:Name="GridItemOverlay" 
        Background="Transparent" 
        Opacity="0.50" /> 
     </Grid> 
    </UserControl> 
</DataTemplate> 

VisualState的工作完全正常的设置,直接使用GridView.ItemContainerStyle设置Template,但不是在一个单独的资源文件从DataTemplate想它的时候的时候。有任何想法吗?

回答

2

对内容模板选择器不确定。 但是,您最初在DataTemplates中使用VisualStateManager的想法应该起作用。

有一件你错过了尝试时,你需要包裹在DataTemplateUserControl标签!否则VisualStateManager将不起作用。

例子在这里找到:https://github.com/AppCreativity/Kliva/blob/master/src/Kliva/XAMLResources/DataTemplates.xaml#L21

+0

我试图用你在'Kliva'中使用它的方式实现'VisualStateManager',而且我还没有得到任何改变。我将XAML发布到我原来的帖子中,因此它格式正确... –

+0

奇怪的是第一次看起来你的DataTemplate xaml看起来是正确的:/ – Depechie

+0

是的,我也这么认为。至少我能够使用从VisualStateManager分离出来的模板。我想,总比没有好。 –

0

我能够实现我的上一个ContentPresenterItemTemplate的内部设置ContentTemplate,这样想的:

<GridView.ItemContainerStyle> 
     <Style TargetType="GridViewItem"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="GridViewItem"> 
         <Grid> 
          <VisualStateManager.VisualStateGroups> 
           <VisualStateGroup x:Name="CommonStates"> 
            <VisualState x:Name="Normal" /> 
            <VisualState x:Name="PointerOver"> 
             <VisualState.Setters> 
              <Setter Target="GridItemOverlay.Background" Value="Green" /> 
             </VisualState.Setters> 
            </VisualState> 
           </VisualStateGroup> 
          </VisualStateManager.VisualStateGroups> 

          <ContentPresenter ContentTemplate="{StaticResource PaymentTemplate}" /> 
          <Border x:Name="GridItemOverlay" 
            Background="Transparent" 
            Opacity="0.50" /> 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </GridView.ItemContainerStyle> 

当然,PaymentTemplate是在DataTemplates.xaml中定义的DataTemplate。理想情况下,我希望VisualStateManagerDataTemplate本身捆绑在一起以清除我的View中的XAML,但这种方式现在可行。