Событие Combobox INotifyPropertyChanged не возникло! - PullRequest
1 голос
/ 26 мая 2010

Я создал комбинированный список и установил наблюдаемую коллекцию в качестве источника элементов и реализовал INotifyPropertyChanged для наблюдаемого элемента коллекции. Даже после этого, когда я выбираю другой элемент в выпадающем списке, метод OnPropertyChange не вызывается. Я думаю, что я не делаю переплет должным образом. Может ли кто-нибудь, пожалуйста, поправьте меня / предложите мне в этом отношении.

--------------------------------- 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
    }
}

Спасибо

1 Ответ

1 голос
/ 31 мая 2010

Нет, вы не привязываетесь правильно, привязка вашего текстового поля должна выглядеть так: -

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

ComboBox не имеет свойства name. У него есть свойство SelectedItem, которое будет выбранным экземпляром Person. Затем вам нужно свойство name этого экземпляра. Следовательно, путь, который вам нужен в привязке: SelectedItem.name.

Теперь вы должны обнаружить, что когда вы редактируете текстовое поле и , перемещаете фокус в другое место, тогда происходит событие PropertyChange, и вы должны увидеть это изменение в поле со списком.

Примечание. По умолчанию текстовое поле примечания не обновляет свое значение, пока пользователь не нажмет на вкладку или каким-либо другим способом не переключит фокус.

...