Hoe te identificeren knop voor lijstitem

Hoe krijg ik toegang tot het object UserNames, dat is gebonden aan de lijst ??

Wat ik tot nu toe heb gedaan:

Item van de lijst is object in mijn geval:

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

Ik gebruik een datasjabloon waarvoor ik een label en een knop heb.

Mijn lijst is als volgt:


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

                            </button>
                        
                    
                
            
        

Waar mijn methode voor Button is. Zoals je kunt zien heb ik geprobeerd om de ouderoptie te gebruiken, maar zonder succes

 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 antwoord

U kunt de DataContext van de knop gebruiken, omdat dit uw UserName -object is

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

    MessageBox.Show(data.UserName);
}

Ik heb altijd gedacht dat met WPF, je applicatie de DataContext is, terwijl de UI-objecten zoals Buttons, ListBoxes, TextBoxes, enz. Gewoon een mooie laag zijn bovenop de DataContext om de gebruiker toe te staan ​​om ermee te communiceren.

1
toegevoegd
@Dabblernl Ja, ik dacht erover om een ​​volledig voorbeeld te schrijven van het gebruik van een RelayCommand voor het ViewModel, maar OP lijkt nieuw voor wpf te zijn dus dacht ik dat ik hem niet zou afschrikken :)
toegevoegd de auteur Rachel, de bron
Dit is het goede, zolang we accepteren dat we het UI-element terug moeten werpen naar een klasse voor bussinesslayers. Maar een beter antwoord is om erop te wijzen hoe de twee volledig te ontkoppelen. Zie Q: stackoverflow.com/questions/1384369/& hellip; bijvoorbeeld.
toegevoegd de auteur Dabblernl, de bron
Dit is precies wat ik nodig had. Ik vind je oplossing leuk als eenvoudig, maar je hebt een verklaring die geweldig is. Dank je
toegevoegd de auteur cpoDesign, de bron

Stel in de XAML de eigenschap Tag in op het huidige item.

In de click-handler, gooi het terug.

Gebruikersnamen user = (afzender als knop) .Tag als gebruikersnamen;

1
toegevoegd

Om een ​​datacollectie te binden, is het vaak het gemakkelijkst om een ​​ObservableCollection te gebruiken (als de gegevens runtime veranderen). Wanneer u de binding uitvoert, moet u een datacontext, een datasoure en een datapad definiëren. Ik zal u adviseren om wat meer te lezen over het binden van MSDN: D

0
toegevoegd

Dit zal voor u werken -

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