我想得到一个按钮的ListViewItem。在普通的WPF中,我使用GetContainerForItem()但找不到WinRT的等价物。在我的AddButton_Click()函数中,您将看到我获取相关按钮被按下的项的id的脆弱方式。
<DataTemplate x:Key="Custom80ItemTemplate">
<Grid Margin="6">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Width="40" Height="40" Click="AddButton_Click" Content="" FontFamily="Segoe UI Symbol" Style="{StaticResource TextButtonStyle}" />
<StackPanel Grid.Column="1" Margin="10,0,0,0">
<TextBlock Text="{Binding name}" Style="{StaticResource ItemTextStyle}" MaxHeight="40"/>
<TextBlock Text="{Binding id}" Style="{StaticResource CaptionTextStyle}" TextWrapping="NoWrap"/>
<TextBlock Text="{Binding group}" Style="{StaticResource CaptionTextStyle}" TextWrapping="NoWrap"/>
</StackPanel>
</Grid>
</DataTemplate>
<ListView x:Name="searchResultsListView" Grid.Row="1"
SelectionMode="None"
HorizontalAlignment="Left"
Margin="10,0,10,10"
ItemTemplate="{StaticResource Custom80ItemTemplate}" />
private async void AddButton_Click(object sender, RoutedEventArgs e)
{
var parent1 = ((FrameworkElement)sender).Parent;
var grid = parent1 as Grid;
var stackpanel = grid.Children[1] as StackPanel;
var textBlock = stackpanel.Children[1] as TextBlock;
}
答案 0 :(得分:1)
为什么需要直接访问模板中的元素?如果您只想访问所单击项目的id
值,则可以将该按钮的命令放在项目本身中:
public class ItemViewModel
{
public string name { get; set; }
public string id { get; set; }
public string group { get; set; }
public ICommand command { get; set; }
public ItemViewModel
{
command = new RelayCommand(_ => OnClick());
}
private void OnClick()
{
// access id here
}
}
您可以找到RelayCommand
实施here。
现在只需通过绑定command
来替换事件处理程序:
<Button Grid.Column="0" Width="40" Height="40" Command="{Binding command}" Content="" FontFamily="Segoe UI Symbol" Style="{StaticResource TextButtonStyle}" />