INotifyPropertyChanged的用户控件中(INotifyPropertyChange

2019-07-31 16:14发布

我有一个从TextBox控件继承的自定义控件。 我想实现INotifyPropertyChanged在我的自定义控制界面。

public class CustomTextBox : TextBox, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(string info)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
}

我的问题是,当我尝试提出一个PropertyChanged事件PropertyChanged事件处理程序总是空。

任何人都可以帮我吗?

Answer 1:

PropertyChanged事件处理程序alwas空。

直到一些预订了这将始终是真实PropertyChanged事件。

通常情况下,如果你正在做一个自定义的控制,但是,你不会使用INotifyPropertyChanged 。 在这种情况下,你会成为一个自定义依赖属性来代替。 通常情况下,依赖对象(即:对照)将全部使用依赖属性,INPC使用由成为类DataContext这些对象。 这使得结合系统的正常工作。



Answer 2:

什么办法? PropertyChanged事件是由UI代码中使用,但不是在这个意义上说你写。 控制从来没有实现INPC(简称INotifyPropertyChanged的),就必然给实现 INPC对象。 这样某些UI特性,例如对TextBox控件Text属性绑定到这种类的属性。 这是MVVM架构的基础。

例如,你可以编写以下XAML代码:

<TextBlock x:Name="txtBox" Text="{Binding Title}" />

而将针对TextBlock的(或任何祖先,DataContext的传播)的数据上下文中以下列方式中的代码:

txtBox.DataContext = new Movie {Title = "Titanic"};

现在对于类本身:

public class Movie : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(string info)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(info));
    }

    private string _title;
    public string Title
    {
        get { return _title; }
        set
        {
            if (_title == value) return;

            _title = value;
            NotifyPropertyChanged("Title");
        }
    }
}

现在,只要你改变Title属性,无论是在代码或通过其他绑定,用户界面将自动刷新。 谷歌的数据绑定和MVVM。



Answer 3:

做到像我在评论中说。 它不工作,像你这样。 只需创建一个额外的类,并实现Notification Interface也和这个类应用到DataContext中的UserControl 。 它会像你所需要的。

 public partial class W3 : UserControl
    {
        WeatherViewModel model = new WeatherViewModel();

        public W3()
        {
            InitializeComponent();
            this.DataContext = model;
        }

        public void UpdateUI(List<WeatherDetails> data, bool isNextDays)
        {
            model.UpdateUI(data, isNextDays);
        }
    }

    class WeatherViewModel : INotifyPropertyChanged
    {     

        public void UpdateUI(List<WeatherDetails> data, bool isNextDays)
        {
            List<WeatherDetails> weatherInfo = data;
            if (weatherInfo.Count != 0)
            {
                CurrentWeather = weatherInfo.First();
                if (isNextDays)
                    Forecast = weatherInfo.Skip(1).ToList();
            }
        }

        private List<WeatherDetails> _forecast = new List<WeatherDetails>();

        public List<WeatherDetails> Forecast
        {
            get { return _forecast; }
            set
            {
                _forecast = value;
                OnPropertyChanged("Forecast");
            }
        }

        private WeatherDetails _currentWeather = new WeatherDetails();

        public WeatherDetails CurrentWeather
        {
            get { return _currentWeather; }
            set
            {
                _currentWeather = value;
                OnPropertyChanged("CurrentWeather");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string propertyName)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }


文章来源: INotifyPropertyChanged in UserControl