当前位置:   article > 正文

WPF MVVM框架中的INotifyPropertyChanged_wpf inotifypropertychanged 注入

wpf inotifypropertychanged 注入

INotifyPropertyChanged 接口用于通知视图或 ViewModel 绑定哪个属性无关紧要;它已更新。

让我们举个例子来理解这个接口。以一个 WPF 窗口为例,其中共有三个字段:名字、姓氏和全名。在这里,名字和姓氏文本框是可编辑的。因此,根据名字和姓氏的变化,我们必须自动更新全名。

使窗户设计图

WPF 窗口的 XAML 代码如下

  1. <Window x:Class="MVVM_INotifyPropertyChanged.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow">
  2. <Grid Width="400" Height="Auto" HorizontalAlignment="Center" VerticalAlignment="Stretch" Margin="20">
  3. <Grid.RowDefinitions>
  4. <RowDefinition Height="40" />
  5. <RowDefinition Height="40" />
  6. <RowDefinition Height="40" /> </Grid.RowDefinitions>
  7. <Grid.ColumnDefinitions>
  8. <ColumnDefinition Width="90" />
  9. <ColumnDefinition/> </Grid.ColumnDefinitions>
  10. <Label Grid.Row="0" Grid.Column="0" Content="First Name : "></Label>
  11. <Label Grid.Row="1" Grid.Column="0" Content="Last Name : "></Label>
  12. <Label Grid.Row="2" Grid.Column="0" Content="Full Name : "></Label>
  13. <TextBox Grid.Row="0" Grid.Column="1"></TextBox>
  14. <TextBox Grid.Row="1" Grid.Column="1"></TextBox>
  15. <TextBox Grid.Row="2" Grid.Column="1"></TextBox>
  16. </Grid>
  17. </Window>

现在,我们创建一个模型,它包含一个类调用人,它有3个属性“FirstName”,“LastName”,“FullName”。

  1. public class Person {
  2. private string _fisrtname;
  3. public string FirstName {
  4. get {
  5. return _fisrtname;
  6. }
  7. set {
  8. _fisrtname = value;
  9. }
  10. }
  11. private string _lastname;
  12. public string LastName {
  13. get {
  14. return _lastname;
  15. }
  16. set {
  17. _lastname = value;
  18. }
  19. }
  20. private string _fullname;
  21. public string FullName {
  22. get {
  23. return _fisrtname +" "+_lastname; ;
  24. }
  25. set {
  26. _fullname = value;
  27. }
  28. }
  29. public Person() {
  30. _fisrtname = "Nirav";
  31. _lastname = "Daraniya";
  32. }
  33. }

现在我们的实际部分开始了。我们在“Person”类上实现接口,因此它会自动创建一个事件

public event PropertyChangedEventHandler PropertyChanged;  

现在,当类的任何属性被改变时,我们必须调用这个事件。因此,我们创建了一个调用该事件的方法。在这个方法中,我们首先检查事件是否为空,如果不是,我们继续。

  1. private void OnPropertyRaised(string propertyname) {
  2. if (PropertyChanged != null) {}
  3. }

现在,我们通过传递属性名来运行这个事件。

  1. public event PropertyChangedEventHandler PropertyChanged;
  2. private void OnPropertyRaised(string propertyname) {
  3. if (PropertyChanged != null) {
  4. PropertyChanged(this, new PropertyChangedEventArgs(propertyname));
  5. }
  6. }

现在,我们在属性的“Set”部分调用这个方法,属性名是这样的

  1. OnPropertyRaised("FirstName");
  2. OnPropertyRaised("LastName");
  3. OnPropertyRaised("FullName");

在这里,如果名字或姓氏发生变化,我们调用两者的Full Name属性更改,如下所示-现在,完整的Person类看起来像

  1. public class Person: INotifyPropertyChanged {
  2. private string _fisrtname;
  3. public string FirstName {
  4. get {
  5. return _fisrtname;
  6. }
  7. set {
  8. _fisrtname = value;
  9. OnPropertyRaised("FirstName");
  10. OnPropertyRaised("FullName");
  11. }
  12. }
  13. private string _lastname;
  14. public string LastName {
  15. get {
  16. return _lastname;
  17. }
  18. set {
  19. _lastname = value;
  20. OnPropertyRaised("LastName");
  21. OnPropertyRaised("FullName");
  22. }
  23. }
  24. private string _fullname;
  25. public string FullName {
  26. get {
  27. return _fullname;
  28. }
  29. set {
  30. _fullname = value;
  31. OnPropertyRaised("FullName");
  32. }
  33. }
  34. public Person() {
  35. _fisrtname = "Nirav";
  36. _lastname = "Daraniya";
  37. }
  38. public event PropertyChangedEventHandler PropertyChanged;
  39. private void OnPropertyRaised(string propertyname) {
  40. if (PropertyChanged != null) {
  41. PropertyChanged(this, new PropertyChangedEventArgs(propertyname));
  42. }
  43. }
  44. }

现在,我们将这个属性绑定到视图。首先,我们构建解决方案,并将这个模型名称空间添加到视图中,如下所示

xmlns:model="clr-namespace:MVVM_INotifyPropertyChanged.Model"

现在,我们将这个模型添加到窗口资源文件中。

  1. <Window.Resources>
  2. <model:Person x:Key="m" ></model:Person>
  3. </Window.Resources>

为网格设置数据上下文。

DataContext="{Binding Source={StaticResource m}}"

我们为这三个文本框绑定Text属性,如下所示。对于“名称”文本框,使用

Text="{Binding Path=FirstName}" 

下面给出了XAML文件的完整代码

  1. <Window x:Class="MVVM_INotifyPropertyChanged.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:model="clr-namespace:MVVM_INotifyPropertyChanged.Model"
  5. Title="MainWindow">
  6. <Window.Resources>
  7. <model:Person x:Key="m" ></model:Person>
  8. </Window.Resources>
  9. <Grid DataContext="{Binding Source={StaticResource m}}"
  10. Width="400" Height="Auto" HorizontalAlignment="Center" VerticalAlignment="Stretch" Margin="20">
  11. <Grid.RowDefinitions>
  12. <RowDefinition Height="40"/>
  13. <RowDefinition Height="40"/>
  14. <RowDefinition Height="40"/>
  15. </Grid.RowDefinitions>
  16. <Grid.ColumnDefinitions>
  17. <ColumnDefinition Width="90"/>
  18. <ColumnDefinition/>
  19. </Grid.ColumnDefinitions>
  20. <Label Grid.Row="0" Grid.Column="0" Content="First Name : "></Label>
  21. <Label Grid.Row="1" Grid.Column="0" Content="Last Name : "></Label>
  22. <Label Grid.Row="2" Grid.Column="0" Content="Full Name : "></Label>
  23. <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Path=FirstName} , UpdateSourceTrigger=PropertyChanged"></TextBox>
  24. <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Path=LastName} , UpdateSourceTrigger=PropertyChanged"></TextBox>
  25. <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding Path=FullName} , UpdateSourceTrigger=PropertyChanged"></TextBox>
  26. </Grid>
  27. </Window>

现在,运行应用程序并检查结果,在名字和姓氏文本框中更改。现在,您可以显示全名将自动更改,按照名和姓。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/567790
推荐阅读
相关标签
  

闽ICP备14008679号