使用PropertyChanged.Fody可以轻松解决问题。 PropertyChanged.Fody 支持具有继承关系的类。 BasePropertyNullableDateTime { get; set; } public event PropertyChangedEventHandler PropertyChanged null; } } 测试 static void Main(string[] args) { DerivedClass dc = new DerivedClass(); dc.PropertyChanged += Dc_PropertyChanged; dc.DerivedClassPropertyNullableFloat = 69.3f; dc.BasePropertyString Console.WriteLine("---------Clear()-----------"); dc.Clear(); Console.ReadLine(); } static void Dc_PropertyChanged
+= SelectedArea_PropertyChanged; } private void SelectedArea_PropertyChanged(object = null) { PropertyChanged.Invoke(this, new PropertyChangedEventArgs = null) { PropertyChanged.Invoke(this, new PropertyChangedEventArgs return _county; } set { _county = value; if (PropertyChanged = null) { PropertyChanged.Invoke(this, new PropertyChangedEventArgs
+= SelectedArea_PropertyChanged; } private void SelectedArea_PropertyChanged(object = null) { PropertyChanged.Invoke(this, new PropertyChangedEventArgs = null) { PropertyChanged.Invoke(this, new PropertyChangedEventArgs return _county; } set { _county = value; if (PropertyChanged = null) { PropertyChanged.Invoke(this, new PropertyChangedEventArgs
= null) { PropertyChanged(this, new PropertyChangedEventArgs("Name" = null) { PropertyChanged(this, new PropertyChangedEventArgs("Address 使用ObservableCollection类不但可以实现Add、Remove、Clear和Insert操作,还可以触发PropertyChanged事件。 ; private void NotifyPropertyChanged(String info) { if (PropertyChanged ! = null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); }
event PropertyChangedEventHandler PropertyChanged; } 定义很简单,我们可以看到这个接口只定义了一个事件属性——PropertyChanged。 所以这个PropertyChanged就是消息的核心了。 那么学习应用消息的方法就出现了,即,创建一个继承INotifyPropertyChanged接口的类,然后在类内,实现PropertyChanged就可以了。 = null) { this.PropertyChanged(this, new PropertyChangedEventArgs("KName" 有同学可能会好奇,PropertyChanged事件是何时被赋值的呢?别心急,请耐心往下看。 ViewModel定义完成之后,我们再看Xaml对应的cs文件。这里我们也定义了一个KName属性。
; } set { this.age = value; if (PropertyChanged LostFocus 控件失去焦点的时候更新源值 PropertyChanged 绑定的目标值改变时更新。 实例运行后界面如下: ? = null) { PropertyChanged(this, new PropertyChangedEventArgs("Name = null) { this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs = null) { this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs
where (a=> a.name=="zmj") 4.注意 完成一步每次都要编译下 5.DataContent.Load(DataContent.GetUsersByName("zmj"));查询 6 PropertyChanged 事件 : PropertyChanged+=new System.ComponentModel.PropertyChangedEventHandler(DataContent_PropertyChanged ); public void DataContent_PropertyChanged(object sender,System.ComponentModel.PropertyChangedEventArgs
"{Binding Name}" IsChecked="{Binding IsChecked,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged += Item_PropertyChanged; Items.Add(item); Item item1 = new Item(); item1.Name = "456"; item1.PropertyChanged += Item_PropertyChanged; Items.Add(item1 ); Item item2 = new Item(); item2.Name = "789"; item2.PropertyChanged += Item_PropertyChanged; Items.Add(item2); } private void Item_PropertyChanged
= null) { PropertyChanged(this,new PropertyChangedEventArgs(propertyName)); -= new PropertyChangedEventHandler(item_PropertyChanged); item.PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged); } } = null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName )); } } public event PropertyChangedEventHandler PropertyChanged; }
= this.PropertyChanged; if ((propertyChanged ! = null)) { propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName = this.PropertyChanged; if ((propertyChanged ! = null)) { propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName = this.PropertyChanged; if ((propertyChanged !
= null) { item.PropertyChanged += new PropertyChangedEventHandler (item_PropertyChanged); } } } private void UnRegisterPropertyChanged = null) { item.PropertyChanged -= new PropertyChangedEventHandler (item_PropertyChanged); } } } private void item_PropertyChanged
NotifyPropertyChanged : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged protected virtual void OnPropertyChanged<T>(Expression<Func<T>> expression) { if (PropertyChanged e = new PropertyChangedEventArgs(((MemberExpression)expression.Body).Member.Name); PropertyChanged virtual void RaisePropertyChanged(string propertyName) { PropertyChangedEventHandler propertyChanged = PropertyChanged; if (propertyChanged !
OnPropertyChanged("Name");//会造成硬编码错误 } } public event PropertyChangedEventHandler PropertyChanged ; public void OnPropertyChanged(string propertyName) { if (PropertyChanged = null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName = null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName )); } } public event PropertyChangedEventHandler PropertyChanged;
+= (s, e) => OnPropertyChanged(null); } public event PropertyChangedEventHandler PropertyChanged ; protected void OnPropertyChanged(string propertyName) => PropertyChanged?. ; protected void OnPropertyChanged(string propertyName) => PropertyChanged?. ; protected void OnPropertyChanged(string propertyName) => PropertyChanged?. ; protected void OnPropertyChanged(string propertyName) => PropertyChanged?.
二、INotifyPropertyChanging之前定义绑定基类的时候,大家都是只关注 INotifyPropertyChanged 这个接口,也就是只会在绑定基类中添加 PropertyChanged INotifyPropertyChanged 接口的(不然就没有 PropertyChanged 事件嘛)。 后来,问了下 ChatGPT,一切就合理了起来:也就是说,订阅 PropertyChanged 事件的,就是 Binding 对象。 这部分其实主要就是通过订阅 PropertyChanged 事件来实现的,无论是借助于 自定义的绑定基类、PropertyChanged.Fody、还是其它框架或库(如 CommunityToolkit.Mvvm )都是可以的,因为它们都会引入 PropertyChanged 事件。
leftFrom; } set { _leftFrom = value; if (this.PropertyChanged } set { _leftTo = value; if (this.PropertyChanged = null) sb.Begin(); } public event PropertyChangedEventHandler PropertyChanged ; private void NotifyPropertyChanged(String propertyName = "") { if (PropertyChanged = null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName
SelectedIndex="0" hc:TitleElement.Title="IP地址" SelectedValue="{Binding IP,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged x:Name="txt_port" hc:TitleElement.Title="监听端口" Text="{Binding Port,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged DynamicResource TitleTextBoxStyle}" Text="{Binding Software_Version,Mode=OneWay,UpdateSourceTrigger=PropertyChanged DynamicResource TitleTextBoxStyle}" Text="{Binding Hardware_Version,Mode=OneWay,UpdateSourceTrigger=PropertyChanged Style="{DynamicResource TitleTextBoxStyle}" Text="{Binding ClientIP,Mode=OneWay,UpdateSourceTrigger=PropertyChanged
public class Person : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged { return _name; } set { _name = value; if (PropertyChanged = null) { PropertyChanged(this, new PropertyChangedEventArgs("Name get { return _age; } set { _age = value; if (PropertyChanged = null) { PropertyChanged(this, new PropertyChangedEventArgs("Age
添加附加属性,并设置绑定项local:ListBoxHelper.SelectedItems="{Binding SelectedItems,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged <TextBlock Width="200" Height="30" Text="{Binding SelectedItemsText,Mode=TwoWay,UpdateSourceTrigger=<em>PropertyChanged</em> Binding Items}" local:ListBoxHelper.SelectedItems="{Binding SelectedItems,Mode=TwoWay,UpdateSourceTrigger=<em>PropertyChanged</em> <TextBlock Width="200" Height="30" Text="{Binding SelectedItemsText,Mode=TwoWay,UpdateSourceTrigger=<em>PropertyChanged</em> <em>PropertyChanged</em>; protected void OnPropertyChanged(string propertyName) { <em>PropertyChanged</em>
NotifyPropertyChangedObject()
{
}
public event PropertyChangedEventHandler PropertyChanged ;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged = null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName -= new PropertyChangedEventHandler(item_PropertyChanged);
item.PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged);
}
}
///