2016-05-17 3 views
1

DataTemplateSelectorを使用するGridViewがあります。 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> 

をしかし、私はVisualStateManagerを使用することができていますように、私はItemContainerStyleの内部DataTemplateを設定しようとしています。

 <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を使用してContentTemplateSelectorItemTemplateSelectorGridViewにあったのと同じ方法を指定:私はこのようにそれを宣言しようとしました。このようにして、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の内側VisualStateManagerを使用しようとしましたが、彼らがトリガされていないので、私はそれを使用するために必要なのですDataTemplateの外側にあるので、の中のContentPresenterを使用したいという欲求があります。

ListViewItemと似たようなことをしますが、同じ問題を抱えていないので、DataTemplateSelectorを使用していません。 VisualStateManagerDataTemplateの中から機能させる方法はありますか、DataTemplateSelectorContentPresenterの中から動作させるにはどうすればよいですか?ここで

EDIT

は、私が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の仕事は完全に罰金直接個別のリソースファイルにDataTemplateからそれをしようとしたときTemplateを設定するGridView.ItemContainerStyleを使用しますが、設定されていません。何か案は?

答えて

2

コンテンツテンプレートセレクタではわかりません。 しかし、DataTemplates内でVisualStateManagerを使用することについての最初の考えが働くはずです。

これを試してみたときに欠けていたことが1つあります。DataTemplate内のすべてを、UserControlタグで囲む必要があります。そうでなければVisualStateManagerは動作しません。

例はこちらをご覧ください:

<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は次のとおりです。https://github.com/AppCreativity/Kliva/blob/master/src/Kliva/XAMLResources/DataTemplates.xaml#L21

+0

私は 'Kliva'でそれを使用する方法で' VisualStateManager'を達成しようとしましたが、まだ変更はありません。私はオリジナルの投稿にXAMLを投稿していますので、正しくフォーマットされています。 –

+0

DataTemplateのxamlが正しく見えるのは奇妙です。/ – Depechie

+0

ええ、私もそう思っていました。少なくとも、VisualStateManagerから切り離されたテンプレートを使って作業することができました。何もないよりも、私は思います。 –

0

私はこのように、私のItemTemplateの内側ContentPresenterContentTemplateを設定することにより、望む午前何を達成することができていますDataTemplates.xamlで定義されるDataTemplateである。理想的にはVisualStateManagerのものをDataTemplateと一緒にバンドルして、XAMLを自分のViewで整理することができますが、今のところこの方法で動作します。

関連する問題