XAML外包数据模板,其中包含APP.xaml中的事件 [英] XAML outsourcing datatemplate with events in APP.xaml

查看:109
本文介绍了XAML外包数据模板,其中包含APP.xaml中的事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个ListViewItemTemplate

<ListView ItemTemplate="{StaticResource MYTEMPLATE}"             
          HorizontalAlignment="Center"
          ScrollViewer.VerticalScrollBarVisibility="Auto"
          ContinuumNavigationTransitionInfo.IsEntranceElement="True">
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel VerticalAlignment="Bottom"/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>

模板如下所示:

<DataTemplate x:Key="GlobalBox">
        <Border Background="#FFFFFFFF" Margin="10 0 0 5" CornerRadius="2 2 15 2">
            <Grid Width="380">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <StackPanel Grid.Row="0" Tag="{Binding ID}" Name="ProfileInfo" Tapped="Profile_Tapped" Orientation="Horizontal" Margin="15 15 15 0">
                    <Grid Width="360" Margin="0 0 0 10">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="75"></ColumnDefinition>
                            <ColumnDefinition Width="*"></ColumnDefinition>
                            <ColumnDefinition Width="50"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Border Grid.Column="0" Height="45" Width="45" CornerRadius="5">
                            <Border.Background>
                                <ImageBrush ImageSource="{Binding ImagePath}" Stretch="UniformToFill"/>
                            </Border.Background>
                        </Border>
                        <StackPanel Grid.Column="1" Orientation="Vertical" Margin="0 5 0 0">
                            <TextBlock Text="{Binding Name}" Foreground="Black" FontSize="18" FontWeight="Bold"></TextBlock>
                            <TextBlock Text="{Binding Handle}" Foreground="DarkGray" FontSize="12"/>
                        </StackPanel>
                        <Image Grid.Column="2" Source="Assets/ActionIcons/logo_blue_32.png" Width="32" VerticalAlignment="Top"></Image>
                    </Grid>
                </StackPanel>
                <StackPanel  Grid.Row="1" Margin="14.5,0,0,0" Height="Auto">
                    <StackPanel Name="TweetContent" Tag="{Binding ID}" Margin="15 0 15 0" Tapped="Content_Tapped">
                        <TextBlock Text ="{Binding Content}" TextWrapping="Wrap" Foreground="Black" FontSize="14" Margin="0 0 0 10"/>
                        <ItemsControl  ItemsSource="{Binding ContentImages}">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <Image Source="{Binding }" MaxWidth="350" Margin="0 0 0 5"  HorizontalAlignment="Center"></Image>
                                    </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                        <TextBlock Foreground="DarkGray" Text="{Binding DateSend}" FontSize="10"></TextBlock>
                    </StackPanel>
                    <StackPanel Name="ActionButtons">
                        <Grid Tag="{Binding ID}" Width="380" Height="25" Margin="0 0 0 10">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>

                            <Button Grid.Column="0" HorizontalAlignment="Center" Margin="20 0 0 0" Style="{StaticResource replyActionButton}" Tapped="Reply_Tapped"></Button>

                            <ToggleButton Grid.Column="2" HorizontalAlignment="Center" 
                                          Style="{StaticResource retweetActionButton}" 
                                          Tapped="Retweet_Tapped"></ToggleButton>
                            <TextBlock Grid.Column="3" HorizontalAlignment="Left" Margin="-15 0 0 0" VerticalAlignment="Center" Text="{Binding RetweetCount}" Foreground="DarkGray"/>

                            <ToggleButton Grid.Column="4" HorizontalAlignment="Center" 
                                          Style="{StaticResource likeActionButton}" 
                                          IsChecked="{Binding LikeState}"  
                                          Tapped="Favourite_Tapped"></ToggleButton>
                            <TextBlock Grid.Column="5"  HorizontalAlignment="Left" Margin="-15 0 0 0" VerticalAlignment="Center" Text="{Binding LikeCount}" Foreground="DarkGray"/>
                        </Grid>
                    </StackPanel>
                </StackPanel>
            </Grid>
        </Border>
    </DataTemplate>

现在,当我将模板放入app.xaml文件时,出现以下编译错误

And now when I put the template in the app.xaml file I am getting the following compile error

不能在Application类XAML文件中设置事件

这对我来说很有意义,但是我该怎么办呢?我可以将变量或其他类似的事件传递到数据模板中吗?

This makes sense for me, but how can I do it anyway? Can I pass the different events like a variable or something into the datatemplate?

//更新-使用USERCONTROL的解决方案WAY2:

//UPDATE - SOLUTION WAY2 using the USERCONTROL:

我已经用上面的代码制作了一个UserControl,并在ListView中实现了它.

I've made a UserControl out of the code above and implemented it in the ListView.

<ListView Grid.Row="1" Margin="0 0 0 5"       
        x:Name = "standardBox"
        HorizontalAlignment="Center"
        ScrollViewer.VerticalScrollBarVisibility="Auto"
        ContinuumNavigationTransitionInfo.IsEntranceElement="True">
    <ListView.ItemTemplate>
        <DataTemplate>
            <local:UCGlobal></local:UCGlobal>
        </DataTemplate>
    </ListView.ItemTemplate>
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel VerticalAlignment="Bottom"/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>

推荐答案

您可以使用一些替代方法:

You could use a few alternatives:

  1. 使用模板内按钮的命令属性(请注意,您正确设置了DataContext以避免绑定错误):

<DataTemplate x:Key="MyTemplate">
    <StackPanel>
        <Button x:Name="button1" Content="Button1" Command="{Binding Btn1Command}" CommandParameter="{Binding ElementName=button1}"/>
        <Button x:Name="button2" Content="Button2" Command="{Binding Btn2Command}" CommandParameter="{Binding ElementName=button2}"/>
        <Button x:Name="button3" Content="Button3" Command="{Binding Btn3Command}" CommandParameter="{Binding ElementName=button3}"/>
    </StackPanel>
</DataTemplate>

如果这是另一种类型的事件,它不会调用该命令,则可以使用InvokeCommandAction,其处理方式与下一个示例所示相同.

If it´s another type of event that won't call the command you could use InvokeCommandAction which will be handled same as shown in the next example.

  1. 使用类似CallMethodAction的触发器(与上面相同.DataContext是将在其中搜索方法的地方.):

  1. Use a trigger like CallMethodAction (same as above. The DataContext is the place where the method will be searched for.):

<DataTemplate x:Key="MyTemplate">
    <StackPanel>
        <Button x:Name="button1" Content="Button1" >
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Tapped">
                    <ei:CallMethodAction MethodName="button1_Tapped"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>...

  • 写一个小的UserControl作为DataTemplate的基础:

  • Write a small UserControl as the base for your DataTemplate:

    XAML:

    <UserControl x:Class="ThreeBtnUserCtrl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:DataTemplateIssue"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
        <StackPanel>
           <Button x:Name="button1" Content="Button" Click="button1_Click"/>
           <Button x:Name="button2" Content="Button" Click="button2_Click"/>
           <Button x:Name="button3" Content="Button" Click="button3_Click"/>
        </StackPanel>
    </UserControl>
    

    背后的代码:

    public partial class ThreeBtnUserCtrl : UserControl
    {
        public ThreeBtnUserCtrl()
        {
            InitializeComponent();
        }
    
    
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            //...some code only controlling view related stuff of your UserCtrl
        }
    
        private void button2_Click(object sender, RoutedEventArgs e)
        {
            //...some code only controlling view related stuff of your UserCtrl
        }
    
        private void button3_Click(object sender, RoutedEventArgs e)
        {
            //...some code only controlling view related stuff of your UserCtrl
        }
    }
    

    在您的DataTemplate中使用它:

    <DataTemplate x:Key="MyTemplate">
        <Grid>
            <local:ThreeBtnUserCtrl/>
        </Grid>
    </DataTemplate>
    

    这篇关于XAML外包数据模板,其中包含APP.xaml中的事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆