【问题标题】:Combobox INotifyPropertyChanged event not raised!未引发组合框 INotifyPropertyChanged 事件!
【发布时间】:2011-02-24 00:47:27
【问题描述】:

我创建了一个组合框并将 observable 集合设置为 itemsource 并在 observable 集合项上实现了 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
    }
}

谢谢

【问题讨论】:

  • 欢迎来到 SO,请花几分钟时间阅读常见问题解答和 Markdown 文档(编辑问题时右侧空白处提供了有用的概要)。

标签: silverlight data-binding silverlight-3.0 inotifypropertychanged


【解决方案1】:

不,您的绑定不正确,您的文本框绑定应如下所示:-

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

ComboBox 没有name 属性。它确实有一个SelectedItem 属性,它将是当前选择的Person 实例。然后,您需要该实例的 name 属性。因此,您在绑定中需要的路径是SelectedItem.name

现在您应该会发现,当您编辑文本框将焦点移到其他位置时,PropertyChange 事件将触发,您应该会在组合框中看到更改。

注意,默认情况下,文本框不会更新其值,直到用户按下选项卡或以其他方式将焦点移到。

【讨论】:

    猜你喜欢
    • 2021-01-20
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多