UserControl中的INotifyPropertyChanged

我有一个inheritance自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事件处理程序始终为null。

有人可以帮帮我吗?

PropertyChanged事件处理程序为null。

在订阅PropertyChanged事件之前,这将始终为真。

通常,如果您正在制作自定义控件,则不会使用INotifyPropertyChanged 。 在这种情况下,您将改为创建自定义依赖项属性 。 通常,依赖项对象(即:控件)都将使用依赖项属性,而INPC由成为这些对象的DataContext的类使用。 这允许绑定系统正常工作。

你有什么期望? PropertyChanged事件由UI代码使用,但在您写作的意义上并非如此。 控件永远不会实现INPC(INotifyPropertyChanged的简称),它们绑定到已实现 INPC的对象。 这样,某些UI属性(例如TextBox控件上的Text属性)绑定到此类上的属性。 这是MVVM架构的基础。

例如,您将编写以下XAML代码:

  

并按以下方式在代码中设置TextBlock(或其任何祖先,传播DataContext)的数据上下文:

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

现在为class级本身:

 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属性,无论是在代码中还是通过其他绑定,UI都将自动刷新。 Google for Data Binding和MVVM。

像我在评论中所说的那样做。 它不像你那样工作。 只需创建一个额外的类并在那里实现Notification Interface ,并将此类应用于UserControlDataContext 。 它会像你需要的那样工作。

  public partial class W3 : UserControl { WeatherViewModel model = new WeatherViewModel(); public W3() { InitializeComponent(); this.DataContext = model; } public void UpdateUI(List data, bool isNextDays) { model.UpdateUI(data, isNextDays); } } class WeatherViewModel : INotifyPropertyChanged { public void UpdateUI(List data, bool isNextDays) { List weatherInfo = data; if (weatherInfo.Count != 0) { CurrentWeather = weatherInfo.First(); if (isNextDays) Forecast = weatherInfo.Skip(1).ToList(); } } private List _forecast = new List(); public List 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)); } }