从ItemClick处理程序

时间:2016-11-29 01:25:56

标签: c# wpf xaml uwp

我正在尝试将ListItemView.Tag中的单击项附加到某个类型,以便我可以在导航中使用它。我有点困惑如何附加对象。

private void ListView_ItemClick(object sender, ItemClickEventArgs e)
{
    this.Frame.Navigate(
        typeof(ListViewItem.Tag),
        e.ClickedItem,
        new Windows.UI.Xaml.Media.Animation.DrillInNavigationTransitionInfo());
    }

这是我的xaml对此的看法..

<ListView x:Name="ContentList"
          Grid.Row="1"
          Header="Select a group to view"
          EntranceNavigationTransitionInfo.IsTargetElement="True"
          IsItemClickEnabled="True"
          ItemClick="ListView_ItemClick"
          Margin="24,0,0,0">
    <ListView.HeaderTemplate>
        <DataTemplate>
            <TextBlock Style="{StaticResource BodyTextBlockStyle}" Margin="12,4" Text="{Binding}"/>
        </DataTemplate>
    </ListView.HeaderTemplate>
    <ListViewItem Content="Open Group" Tag="OpenGroup"/>
    <ListViewItem Content="Closed Group" Tag="ClosedGroup"/>
</ListView>

我基本上希望通过点击“打开组”项并使用this.Frame.Navigate(typeof(OpenGroup));修改为我的页面名称来生成Tag

我想对我添加到列表中的任何项目执行此操作,以便轻松修改导航。

由于

2 个答案:

答案 0 :(得分:1)

  

我基本上想要生成this.Frame.Navigate(typeof(OpenGroup));单击“打开组”项并使用“标记”修改为我的页面名称。

部分同意@Martin Zikmund,因为您在xaml中直接在ListViewItem添加了ListView字符串内容,我们无法访问ListViewItem事件中的ItemClick ,为了访问其ListViewItem并在点击项目时最终访问Tag属性,我们可以使用SelectionChanged事件代替ItemClick事件。例如:

<ListView x:Name="ContentList"
      Header="Select a group to view"
      EntranceNavigationTransitionInfo.IsTargetElement="True"
      SelectionMode="Single"
      SelectionChanged="ContentList_SelectionChanged"
      Margin="24,0,0,0">
    <ListView.HeaderTemplate>
        <DataTemplate>
            <TextBlock  Margin="12,4" Text="{Binding}" />
        </DataTemplate>
    </ListView.HeaderTemplate>
    <ListViewItem Content="Open Group" Tag="OpenGroup"/>
    <ListViewItem Content="Closed Group" Tag="ClosedGroup"/>
</ListView>
  

我知道它应该是一个框架元素,但是,应该有一个OpenGroup或ClosedGroup的值,而不是null。我也不确定如何将字符串作为typeof传递给typeof(),因为typeof将不接受字符串。

然后在SelectionChanged事件中,获取标记属性的类型非常重要。正如您所做的那样,我们可以使用ToString()方法将标记对象转换为字符串,但如果获得其类型,则返回null。这个问题的关键问题是在UWP中我们需要一起构建命名空间和这个类型的字符串,这里是示例:

private void ContentList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var item = e.AddedItems.FirstOrDefault() as ListViewItem; //single selection mode
    var type = Type.GetType("UWPControlsIssues4." + item.Tag.ToString()); //my project namespace is "UWPControlsIssues4"
    frame.Navigate(type);
}

我写这个答案并不是说马丁的答案是错的,要做到这一点,你需要建立你的数据模型并改变一堆代码,通常我们以马丁的方式做这项工作。我认为这个答案是你要使用的方法。

答案 1 :(得分:0)

使用简单ListViewItems您无法轻松实现目标。在ItemClick处理程序中,您只能访问所点击的“商品”,该商品只是您在string的{​​{1}}而非Content中输入的ListViewItem值1}}本身。这意味着您无法访问ListViewItem

您必须创建一个自定义类保留“菜单项”

Tag

正如您所看到的,我已经包含了一个public class MenuItem { public MenuItem( string displayText, Type targetPage ) { DisplayText = displayText; TargetPage = targetPage; } public string DisplayText { get; } public Type TargetPage { get; } } 属性来保存您要导航到的页面。现在,在当前构造函数中,您将在Type之后执行此操作:

this.InitializeComponent();

这样我们就将项目设置为ContentList.ItemsSource = new List<MenuItem>() { new MenuItem( "Open Group", typeof( OpenGroupPage ) ), new MenuItem( "Closed Group", typeof( ClosedGroupPage ) ), }; 的来源。现在控件有一些输入,但不知道如何显示ListView 。所以我们需要添加MenuItem

来更新它
ItemTemplate

请注意原始<ListView x:Name="ContentList" Grid.Row="1" Header="Select a group to view" EntranceNavigationTransitionInfo.IsTargetElement="True" IsItemClickEnabled="True" ItemClick="ListView_ItemClick" Margin="24,0,0,0"> <ListView.HeaderTemplate> <DataTemplate> <TextBlock Style="{StaticResource BodyTextBlockStyle}" Margin="12,4" Text="{Binding}"/> </DataTemplate> </ListView.HeaderTemplate> <ListView.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding DisplayText}" /> </DataTemplate> </ListView.ItemTemplate> </ListView> 元素应删除,不再需要它们。

最后,我们将更新ListViewItem处理程序以使用新的ItemClick实例:

MenuItem

由于private void ListView_ItemClick(object sender, ItemClickEventArgs e) { var menuItem = e.ClickedItem as MenuItem; this.Frame.Navigate( menuItem.TargetPage, menuItem.DisplayText, new Windows.UI.Xaml.Media.Animation.DrillInNavigationTransitionInfo()); } 的{​​{1}}设置为ItemsSource列表,因此ListView属性现在包含一个被点击的MenuItem实例。 ClickedItem属性是您导航到的页面,MenuItem是菜单中显示的文本。