我正在尝试将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
。
我想对我添加到列表中的任何项目执行此操作,以便轻松修改导航。
由于
答案 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
是菜单中显示的文本。