如何识别列表项的按钮

时间:2011-10-27 19:07:54

标签: wpf

如何访问绑定到列表的对象UserNames?

到目前为止我做了什么:

在我的案例中,列表的项目是对象:

 new List<UserNames>();
 this.users.Add(new UserNames() {Id = 1, UserName = "name 1"});

我正在使用我有标签和按钮的数据模板。

我的清单如下:

<ListBox Grid.Column="1" Grid.Row="1" Name="listBox1" ItemsSource="{Binding}" SelectedValuePath="Id">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <WrapPanel Orientation="Vertical">
                        <StackPanel>
                            <Label Content="{Binding UserName}"  />
                        </StackPanel>
                        <StackPanel Name="ButtonStackPanel">
                            <Button Name="MyButton" Content="Click Me" Click="MyButton_Click">

                            </Button>
                        </StackPanel>
                    </WrapPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

我的Button方法是哪里。正如你所看到我确实尝试使用父选项,但没有成功

 private void MyButton_Click(object sender, RoutedEventArgs e)
        {
            //StackPanel panel = (StackPanel)((Button)sender).Parent;
            //WrapPanel wrapPanel = (WrapPanel) panel.Parent;
            //ListItem listItem = (ListItem) wrapPanel.Parent;
            //ListBox box = (ListBox) listItem.Parent;
            //UserNames itemToReport = (UserNames) (box.SelectedItem);
            //MessageBox.Show(itemToReport.UserName);


        }

4 个答案:

答案 0 :(得分:1)

在XAML中,将Tag属性设置为当前项。  

在点击处理程序中,将其强制转换。

Usernames user =(sender as Button).Tag as Usernames;

答案 1 :(得分:1)

您可以使用按钮的DataContext,因为它将是您的UserName对象

private void MyButton_Click(object sender, RoutedEventArgs e)
{
    Button b = sender as Button;
    UserNames data = b.DataContext as UserNames;

    MessageBox.Show(data.UserName);
}

我一直认为使用WPF,你的应用程序是DataContext,而像Buttons,ListBoxes,TextBoxes等UI对象只是位于DataContext之上的漂亮层。允许用户与之互动。

答案 2 :(得分:0)

要绑定数据收集,通常最容易使用ObservableCollection(如果数据正在更改运行时)。进行绑定时,必须定义datacontext,datasoure和datapath。我建议你阅读更多有关MSDN绑定的内容:D

答案 3 :(得分:0)

这对你有用 -

MessageBox.Show(((sender as Button).DataContext as UserNames).UserName);