リストアイテムのボタンを識別する方法

オブジェクトUserNamesにアクセスするには、どうすればリストにバインドされますか?

私はこれまで何をしたのですか?

私の場合、リストの項目はオブジェクトです。

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

私はラベルとボタンを持っているデータテンプレートを使用しています。

私のリストは以下の通りです:


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

                            </button>
                        
                    
                
            
        

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 答え

Buttonの UserName オブジェクトであるため、Buttonの DataContext を使用することができます

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 であり、ボタン、リストボックス、テキストボックスなどのUIオブジェクトは単純に DataContext を使用して、ユーザーとの対話を可能にします。

1
追加された
@Dabblernlはい、私はViewModelにRelayCommandを使用する完全な例を書こうと思っていましたが、OPはWPFに新しくなっているようですので、私は彼を怖がらないでしょう:)
追加された 著者 Rachel,
UI要素をbussinesslayerクラスにキャストする必要があることを受け入れる限り、これは正しいです。しかし、より良い答えは、2つを完全に切り離す方法を指摘することです。 Q: stackoverflow.com/questions/1384369/…を参照してください。 を参照してください。
追加された 著者 Dabblernl,
これはまさに私が必要としていたものです。私はあなたのソリューションがシンプルだが好きだが、それは素晴らしい説明だ。ありがとうございました
追加された 著者 cpoDesign,

XAMLで、Tagプロパティを現在のアイテムに設定します。

クリックハンドラで、それを元に戻します。

Usernames user =(送信者はボタンとして).Tagをユーザー名として使用します。

1
追加された

データコレクションをバインドするには、ObservableCollectionを使用するのが最も簡単です(データがランタイムを変更している場合)。バインディングを行うときは、datacontext、datasoure、およびdatapathを定義する必要があります。私はあなたにMSDNのバインディングについてもっとお読みになることをアドバイスします:D

0
追加された

これはあなたのために働く -

MessageBox.Show(((sender as Button).DataContext as UserNames).UserName);
0
追加された