0

WPFでのバインドを理解していて、オブジェクトのバインドに関する問題が発生しています。

itemsourceがユーザーのリストに設定されたコンボボックスがあります

ICollection<User> users = User.GetAll();
cmbContacts.ItemsSource = users;      

選択したユーザーを保持するオブジェクトもUIにあります。

public partial class MainWindow : Window
{

    private User selectedUser = new User();

    public MainWindow()
    {
        InitializeComponent();
        ReloadContents();

        Binding b = new Binding();
        b.Source = selectedUser;
        b.Path = new PropertyPath("uFirstName");
        this.txtFirstName.SetBinding(TextBox.TextProperty, b);
   }

そして、私のコンボボックスのSelectChangedメソッドでは...

selectedUser = (User)e.AddedItems[0];

ただし、テキストボックスは更新されていません。バインディングコードをコンボボックスのSelectChangedメソッドに移動することで、バインディングが機能することを確認できます

selectedUser = (User)e.AddedItems[0];    
Binding b = new Binding();
b.Source = selectedUser;
b.Path = new PropertyPath("uFirstName");
this.txtFirstName.SetBinding(TextBox.TextProperty, b);

これで、テキストボックスが正常に更新されます。これは物事の間違ったやり方のようです。誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

0

コードに1つのバグがあります。フィールドselectedUserを設定しても、このデータが変更されたことを通知しません。サンプルは次のようになります。

public partial class MainWindow : Window, INotifyPropertyChanged
{ 
    private User selectedUser;

    public User SelectedUser 
    {
       get 
       {
           return selectedUser;
       }
       set
       {
           selectedUser = value;
           NotifyPropertyChanged("SelectedUser");
       }
    }

    public MainWindow() 
    { 
        InitializeComponent(); 
        ReloadContents(); 

        // Now the source is the current object (Window), which implements
        // INotifyPropertyChanged and can tell to WPF infrastracture when 
        // SelectedUser property will change value
        Binding b = new Binding(); 
        b.Source = this; 
        b.Path = new PropertyPath("SelectedUser.uFirstName"); 
        this.txtFirstName.SetBinding(TextBox.TextProperty, b); 
   } 

   public event PropertyChangedEventHandler PropertyChanged;

   private void NotifyPropertyChanged(string info)
   {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
   }
}

また、プロパティに新しい値を設定する必要があることを忘れないでください。フィールドは使用しないでください。そのため、SelectChangedは次のようになります。

SelectedUser = (User)e.AddedItems[0]; 
于 2012-08-12T19:02:36.647 に答える