Як ідентифікувати кнопку для елемента списку

Як мені отримати доступ до об'єкту UserNames, який пов'язаний зі списком ??

Що я зробив до цих пір:

Предмет списку є об'єктом у моєму випадку:

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

Я використовую шаблон даних, для якого я мітка та кнопка.

Мій список виглядає наступним чином:


            
                
                    
                        
                            
                        
                        
                            <button Name="MyButton" Content="Click Me" Click="MyButton_Click">

                            </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);


        }
1

4 Відповіді

Ви можете скористатися кнопкою 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 , тоді як об'єкти інтерфейсу користувача, такі як кнопки, списки, текстові вікна тощо, є просто гарним шаром, який знаходиться на вершині рядка DataContext , щоб дозволити користувачеві взаємодіяти з ним.

1
додано
@Dabblernl Так, я подумав написати повний приклад використання RelayCommand для ViewModel, але OP, здається, новий для WPF, так що я не налякаю його :)
додано Автор Rachel, джерело
Це правильно, поки ми визнаємо, що нам потрібно відкинути елемент інтерфейсу для класу bussinesslayer. Але краща відповідь - це вказати, як цілком відокремити ці два. Див. Q: stackoverflow.com/questions/1384369/ … , наприклад.
додано Автор Dabblernl, джерело
Це саме те, що мені потрібно. Мені подобається ваше рішення як просте, але у вас є пояснення, яке чудово. Дякую
додано Автор cpoDesign, джерело

В XAML встановіть властивість Tag для поточного елемента.

У обробнику кліків поверніть його назад.

Користувач називає user = (відправник як кнопка) .Tag як ім'я користувача;

1
додано

Щоб зв'язати дані з колекцією, найчастіше просто використовувати ObservableCollection (якщо дані змінюють runtime). Коли ви виконуєте зв'язування, вам слід визначити текстовий каталог даних, датаура і датапат. Я пораду тобі прочитати ще про обов'язковість для MSDN: D

0
додано

Це буде працювати для вас -

MessageBox.Show(((sender as Button).DataContext as UserNames).UserName);
0
додано