我的ComboBox中的绑定有更新问题。我已经创建了一个简化的示例来说明这个问题。下面将粘贴所有相关代码。
如上图所示,我有一个TextBlock(黑色)显示所选Person的“SelectedPerson.FullName”属性。所选Person的FirstName和LastName属性显示在FullName下面的2个TextBox中。ComboBox的DisplayMemberPath绑定到FullName,并且combobox包含Person对象列表。
在TextBlock、ComboBox和ComboBox下拉列表中,“FullName”属性应该是相同的。
然而,ComboBox下拉列表只在第一次打开时正确地更新,并且在此后不再更新。因此,如果我在文本框中编辑了FirstName并单击下拉列表,然后再次编辑它并单击下拉列表,我们最终会显示3个不同的“FullName”值。
我在我的代码后台使用INotifyPropertyChanged来通知更改“SelectedPerson”。这似乎很好地更新了TextBlock,但是由于某种原因,ComboBox没有使用新的“FullName”进行更新。
我尝试在发送“SelectedPerson”通知时发送“FullName”通知,但也无法使其工作。
有人能告诉我为什么ComboBox在更改FirstName文本时没有更新吗?
谢谢。
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");
}
}
}
Person.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();
}
}
}
}