5

在此处输入图像描述

我的 ComboBox 中的 Binding 存在更新问题。我创建了一个简化的示例来说明这个问题。我将在下面粘贴所有相关代码。

所以在上图中,我有一个 TextBlock(黑色),它显示了 SelectedPerson 的“SelectedPerson.FullName”属性。SelectedPerson 的 FirstName 和 LastName 属性显示在 FullName 下方的 2 个文本框中。ComboBox DisplayMemberPath 绑定到“FullName”,并且组合框包含一个 Person 对象列表。

TextBlock、ComboBox 和 ComboBox 下拉列表中的“FullName”属性应该相同。

但是,它仅在 TextBlock 中正确更新。组合框下拉菜单仅在第一次打开时更新,之后不再更新。因此,如果我在文本框中编辑 FirstName 并单击下拉列表,然后对其进行更多编辑并再次单击下拉列表,我们最终会为 SelectedPerson 显示 3 个不同的“FullName”值。

我在后面的代码中使用 INotifyPropertyChanged 来通知“SelectedPerson”何时更改。这似乎可以很好地更新 TextBlock,但由于某种原因,ComboBox 没有使用新的“FullName”进行更新。

当我发送“SelectedPerson”通知时,我尝试发送“FullName”通知,但它也无法正常工作。

谁能告诉我为什么当我更改 FirstName 文本时 ComboBox 没有更新?

谢谢。

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");
        }
    }
}

个人.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();
            }
        }
    }
}
4

1 回答 1

13

您还需要在您的 Person 对象中实现通知系统。说SelectedPerson改得不够好。只需像您已经在您的和引发事件而不是您的自定义事件一样实施INotifyPropertyChanged,它应该可以工作。PersonMainWindowPropertyChangedChanged

于 2012-06-15T18:40:03.200 回答