WPF ComboBox Liaison n'a pas à jour correctement

WPF ComboBox Liaison n'a pas à jour correctement

J'ai un problème avec la mise à jour de Liaison dans ma zone de liste déroulante. J'ai créé un exemple simplifié d'illustrer ce problème. Je vais coller tout le code correspondant ci-dessous.

Donc dans l'image ci-dessus, j'ai un TextBlock (en noir) qui montre le " SelectedPerson.FullName' propriété de la SelectedPerson. FirstName et LastName propriétés de la SelectedPerson sont affichés dans les 2 zones de texte ci-dessous le Nom complet. La zone de liste déroulante DisplayMemberPath est lié à 'FullName' et la zone de liste déroulante contient une liste d'objets de la Personne.

L' 'FullName' propriété doit être le même dans le TextBlock, ComboBox, et de la zone de liste déroulante liste déroulante.

Toutefois, c'est SEULEMENT la mise à jour correctement dans le TextBlock. La zone de liste déroulante liste Déroulante met juste à jour la première fois qu'il est ouvert et n'est pas mise à jour après que. Donc, si j'ai modifier le nom dans la zone de texte et cliquez sur la liste déroulante, puis de le modifier un peu plus et cliquez sur le menu déroulant de nouveau, nous nous retrouvons avec 3 'FullName' valeurs affichées pour la SelectedPerson.

Je suis à l'aide de INotifyPropertyChanged dans mon code behind pour vous avertir lorsque des "SelectedPerson" est modifié. Cela semble fonctionner correctement mise à jour le TextBlock, mais pour une raison quelconque, ComboBox n'est pas mise à jour avec le nouveau "FullName".

J'ai tenté d'envoyer un "FullName" avertir lorsque j'envoie 'SelectedPerson' informer, mais il n'a pas de travail non plus.

Quelqu'un peut-il me dire pourquoi la zone de liste déroulante n'est pas mise à jour lorsque je modifie le texte Prénom?

Grâce.

MainWindow.xaml:

<Window x:Class="ComboBoxBinding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <StackPanel Margin="50" Width="150">
        <TextBlock Margin="0,0,0,10" Height="30" Padding="8" Background="Black" Foreground="White" Text="{Binding SelectedPerson.FullName}"/>
        <TextBox Text="{Binding SelectedPerson.FirstName, UpdateSourceTrigger=PropertyChanged}"/>
        <TextBox Text="{Binding SelectedPerson.LastName, UpdateSourceTrigger=PropertyChanged}"/>
        <ComboBox Margin="0,16,0,0"
                  ItemsSource="{Binding People}"
                  DisplayMemberPath="FullName"
                  SelectedItem="{Binding SelectedPerson, UpdateSourceTrigger=PropertyChanged}">
        </ComboBox>
    </StackPanel>
</Window>

MainWindow.xaml.cs:

using System.Collections.Generic;
using System.ComponentModel;
namespace ComboBoxBinding
{
public partial class MainWindow : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private List<Person> _people = new List<Person>();
public List<Person> People 
{
get { return _people; }
}
private Person _selectedPerson;
public Person SelectedPerson
{
get { return _selectedPerson; }
set 
{
_selectedPerson = value;
OnPropertyChanged("SelectedPerson");
}
}
public MainWindow()
{
GenerateLaneConfigurations();
InitializeComponent();
}
private void GenerateLaneConfigurations()
{
People.Add(new Person("Elmer", "Fudd"));
People.Add(new Person("Bugs", "Bunny"));
People.Add(new Person("Donald", "Duck"));
foreach (Person person in _people)
{
person.Changed += person_Changed;
}
SelectedPerson = People[0];
}
void person_Changed()
{
OnPropertyChanged("SelectedPerson");
}
}
}

Personne.cs:

namespace ComboBoxBinding
{
public class Person
{
private string _firstName;
public string FirstName
{
get { return _firstName; }
set { _firstName = value; OnChanged(); }
}
private string _lastName;
public string LastName
{
get { return _lastName; }
set { _lastName = value; OnChanged(); }
}
public string FullName
{
get { return string.Format("{0} {1}", FirstName, LastName);}
}
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public delegate void ChangedEventHandler();
public event ChangedEventHandler Changed;
protected void OnChanged()
{
if (Changed != null)
{
Changed();
}
}
}
}

OriginalL'auteur Curtis | 2012-06-15