1

J'ai créé une zone de liste déroulante et ai défini la collection observable comme élémentsource et implémenté INotifyPropertyChanged sur l'élément de collection observable. Même après cela, lorsque je sélectionne élément différent dans la zone de liste déroulante, la méthode OnPropertyChange n'est pas appelée. Je pense que je ne fais pas la liaison correctement. Quelqu'un pourrait-il me corriger/me suggérer à cet égard?Événement Combobox INotifyPropertyChanged non déclenché!

--------------------------------- MainPage.xaml ---------- -----------------------------------------

<UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="MasterDetailsUpdate.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"> 

    <StackPanel Width="300"> 

      <ComboBox Name="cboName"></ComboBox> 

      <TextBox Name="tbxName" Text="{Binding Path=name,Mode=TwoWay,ElementName=cboName}" ></TextBox> 


    </StackPanel> 

</UserControl> 

- ------------------------- MainPage.xaml.cs -------------------- ---------------------------

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using System.Collections.ObjectModel; 
using System.Collections.Specialized; 
using System.ComponentModel; 

namespace MasterDetailsUpdate 
{ 

    public partial class MainPage : UserControl 
    { 
     public MainPage() 
     { 
      InitializeComponent(); 
      Loaded += new RoutedEventHandler(MainPage_Loaded); 
     } 

     void MainPage_Loaded(object sender, RoutedEventArgs e) 
     { 
      ObservableCollection<Person> persons = new ObservableCollection<Person>(); 
      persons.Add(new Person { city = "c1", name = "n1" }); 
      persons.Add(new Person { city = "c2", name = "n2" }); 
      persons.Add(new Person { city = "c3", name = "" }); 
      persons.Add(new Person { city = "c4", name = "" }); 
      persons.Add(new Person { city = "c5", name = "n1" }); 

      cboName.ItemsSource = persons; 
      cboName.DisplayMemberPath = "name"; 
     }  
    } 

    public class Person : INotifyPropertyChanged 
    { 
     private string _name; 
     private string _city; 
     public string name 
     { 
      set 
      { 
       _name = value; 
       OnPropertyChanged("name"); 
      } 
      get 
      { 
       return _name; 
      } 
     } 


     public string city 
     { 
      set 
      { 
       _city = value; 
       OnPropertyChanged("city"); 
      } 
      get 
      { 
       return _city; 
      } 
     } 

     #region INotifyPropertyChanged Members 

     public event PropertyChangedEventHandler PropertyChanged; 
     private void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     #endregion 
    } 
} 

Merci vous

+0

Bienvenue dans SO, veuillez prendre quelques minutes pour lire la FAQ et la documentation Markdown (dont un synoptique utile est disponible dans la marge de droite lors de l'édition d'une question). – AnthonyWJones

Répondre

1

non, vous n'êtes pas liez droit , votre textbox devrait ressembler à ceci: -

<TextBox Name="tbxName" Text="{Binding Path=SelectedItem.name, Mode=TwoWay, ElementName=cboName}" /> 

Un ComboBox ne dispose pas d'une propriété name. Il a une propriété SelectedItem qui sera l'instance Person actuellement sélectionnée. Vous voulez ensuite la propriété name de cette instance. Par conséquent, le chemin dont vous avez besoin dans la liaison est SelectedItem.name.

Maintenant, vous devriez constater que lorsque vous modifiez la zone de texte et déplacer le focus ailleurs, l'événement PropertyChange se déclenche et vous devriez voir les changements dans la zone de liste déroulante. Remarque: par défaut, textbox ne met pas à jour sa valeur tant que l'utilisateur n'a pas appuyé sur la touche tab ou ne l'a pas fait d'une autre manière.

Questions connexes