Data binding 如何识别在ListBox ItemTemplate内单击按钮时选择的项目

Data binding 如何识别在ListBox ItemTemplate内单击按钮时选择的项目,data-binding,windows-phone,Data Binding,Windows Phone,我有一个ItemTemplate,其中包含一个简单的按钮。当我单击此按钮时,我需要一种方法来标识单击的行,以拉出绑定到列表框的项目 XAML 提前感谢最好的方法是在模板本身中有一些唯一的标识符。例如,您有一个TextBlock——给它一个唯一的名称,当按下按钮时,在次网格中搜索带有标识符的TextBlock,并读取其Text属性。为什么在带有SelectionChanged事件的列表框中有带有click事件的按钮?这弥补了一些可怕的用户体验,如果他们有不同的行动 <Button Click

我有一个ItemTemplate,其中包含一个简单的按钮。当我单击此按钮时,我需要一种方法来标识单击的行,以拉出绑定到列表框的项目

XAML


提前感谢

最好的方法是在模板本身中有一些唯一的标识符。例如,您有一个
TextBlock
——给它一个唯一的名称,当按下按钮时,在次网格中搜索带有标识符的
TextBlock
,并读取其
Text
属性。

为什么在带有SelectionChanged事件的列表框中有带有click事件的按钮?这弥补了一些可怕的用户体验,如果他们有不同的行动

<Button Click="ShowStuffOnMap_Click" Tag="{Binding}">
通常的方法是创建一个数据绑定列表框,然后使用SelectionChanged事件来读取所选项目

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var listBox = sender as ListBox;
    var selectedItem = listBox.SelectedItem as MyDataBoundType;

    if (selectedItem != null)
    {
        // do stuff
    }

    // if you use the ListBox for navigation, set the SelectedIndex to -1
    // listBox.SelectedIndex = -1;
}
但是,如果您真的想这样做,则需要使用
标记
属性

<Button Click="ShowStuffOnMap_Click" Tag="{Binding}">

但我仍然认为您的方法是错误的,代表着糟糕的用户体验,因为列表的正常方法是列表中的整行仅为一个选择。

他要求的是数据绑定项,而不是UI元素来更改其视觉状态。也许,但与使用数据绑定相比,这是血腥的疯狂。你应该更清楚,每种情况都有更好的实践。对于模板中可能存在的多个单击侦听器,我将坚持使用唯一的ID。更好的做法是使用命令绑定发送绑定。你也应该知道。然而,对于初学者的建议是使用Tag属性。你的建议既不是好的实践,也不是明智的。同样,这取决于用户界面的复杂性。当你正在构建一个复杂的应用程序时,那么当然可以使用MVVM和所有花哨的东西。对于一些简单化的东西,你甚至不需要标签。可怕的UX实践?如果每个项目都有两个按钮-共享和收藏。有多种情况下可以使用此功能,在列表中选择一个项目与此无关。问题在于,在一行上有多个功能。它很少需要好的用户体验。共享和收藏夹之类的东西可能是详细信息视图上的应用程序栏按钮。不在项目列表中。例如:-特定项目的菜单+评级控制。不管是否可用,应用程序都有这样的功能。这是糟糕用户体验的一个很好的例子。点击整个餐厅收听菜单,是一个更好的设计,更好的用户体验。然后可以在详细信息视图中进行评级,如Windows Phone Marketplace。-只是为了比较。用户往往会被移动应用程序上的“选择并执行”弄糊涂。更容易单击并完成操作。
<Button Click="ShowStuffOnMap_Click" Tag="{Binding}">
private void ShowStuffOnMap_Click(object sender, RoutedEventArgs e)
{
    var button = sender as Button;
    var selectedItem = button.Tag as MyDataBoundType;
}