我有一个从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事件处理程序总是空。
任何人都可以帮我吗?
PropertyChanged事件处理程序alwas空。
直到一些预订了这将始终是真实PropertyChanged
事件。
通常情况下,如果你正在做一个自定义的控制,但是,你不会使用INotifyPropertyChanged
。 在这种情况下,你会成为一个自定义依赖属性来代替。 通常情况下,依赖对象(即:对照)将全部使用依赖属性,INPC使用由成为类DataContext
这些对象。 这使得结合系统的正常工作。
什么办法? 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。
做到像我在评论中说。 它不工作,像你这样。 只需创建一个额外的类,并实现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));
}
}