问题描述
我有一个ListView
和ItemTemplate
<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:
-
使用模板内按钮的命令属性(请注意,您正确设置了
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.
-
使用类似
CallMethodAction
的触发器(与上面相同.DataContext
是将在其中搜索方法的地方.):
Use a trigger like
CallMethodAction
(same as above. TheDataContext
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中的事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!