多少个针对INotify

在C#中国国投息有四个针对,多少个对准Message,二个针对性INotify。这里首要讲INotify。

INotify也可以有人称之为[通知],不管叫音讯如故布告,都是三个意思,正是传递新闻。

音讯的定义

INotify音讯其实是四个接口,接口名称叫INotifyPropertyChanged。接口定义如下:

 //向客户端发出某一属性值已更改的通知。
 public interface INotifyPropertyChanged
 {
     //在更改属性值时发生。
     event PropertyChangedEventHandler PropertyChanged;
 }

概念很简短,大家得以看来那么些接口只定义了一个风云性质——PropertyChanged。所以这些PropertyChanged正是音信的大旨了。

那正是说学习应用消息的方法就应际而生了,即,创制三个继续INotifyPropertyChanged接口的类,然后在类内,实现PropertyChanged就足以了。

音讯的施用

地方介绍音信是用来传递音信的。那么也许会有同学好奇,引用类型的靶子不就足以打包传递消息吗?为何还要用新闻呢?

因为有一些数据是积存在非引用类型的指标中的。比方字符串,或数字等。

为了让字符串、数字等数据的修改也能如援引类型同样,能够传递回给源,就须要采纳消息了。

上边大家来看下新闻的根基用法。

先是,大家使用WPF创设四个门类,然后成立二个页面,起名叫WindowNotify,编辑内容如下:

<Window x:Class="WpfApplication.WindowNotify"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="WindowNotify" Height="120" Width="200">
    <Grid>
        <StackPanel>
            <TextBox Name="txtName" VerticalAlignment="Top" Height="24" ></TextBox>
            <TextBox Name="txtNameNotify" VerticalAlignment="Top"  Height="24" ></TextBox>
            <Button Click="Button_Click" Height="30" Content="查看结果"></Button>
        </StackPanel>
    </Grid>
</Window>

接下去,编辑Xaml对于的cs文件,内容如下:

public partial class WindowNotify : Window
{ 
    private string _KName = "Kiba518"; 
    public string KName
    {
        get { return _KName; }
        set { _KName = value; }
    }
    WindowNotifyViewModel vm;
    public WindowNotify()
    {
        InitializeComponent();
        vm = new WindowNotifyViewModel(); 
        Binding bding = new Binding();
        bding.Path = new PropertyPath("KName");
        bding.Mode = BindingMode.TwoWay; 
        bding.Source = vm; 
        txtNameNotify.SetBinding(TextBox.TextProperty, bding);  
        txtName.Text = KName;
        txtNameNotify.Text = vm.KName; 
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("[txtName:" + KName + "]     |    [txtNameNotify:" + vm.KName + "]");
    } 
}
public class WindowNotifyViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private string _KName = "Kiba518Notify";
    public string KName
    {
        get { return _KName; }
        set
        {
            _KName = value;
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs("KName"));
            }
        }
    }
}

此地我们成立了八个ViewModel——WindowNotifyViewModel,大家让那么些VM承接INotifyPropertyChanged,然后定义了三个KName属性,并定义了PropertyChanged事件触发的岗位。

有同学恐怕会惊叹,PropertyChanged事件是哪一天被赋值的啊?别心急,请耐性往下看。

ViewModel定义完毕今后,大家再看Xaml对应的cs文件。这里我们也定义了多个KName属性。然后起头化时,将cs文件的KName和VM的KName分别赋值给前台定义的多个TextBox控件。

这里用vm的KName属性赋值时,稍微有一些特地,稍后再介绍。

下一场我们运维页面,并修改四个文本框内的值。再点击查阅结果开关。获得分界面如下:

图片 1

能够从图中走访,分界面修改了TextBox的Text属性,WindowNotifyViewModel的KName属性对修改的值进行了一齐,而WindowNotify的KName未有共同。

看完毕果,大家回过来看下VM的KName的不测赋值格局。我们先看率先句:

Binding bding = new Binding();

这里的Binding是绑定的意味,这行代码很显然是用来定义叁个绑定。

绑定是个不佳了解的词,我们该如何理解呢?

非常轻巧,大家得以将绑定通晓为套索,既然是套索,那么就该有两脾性子,五个是套头,一个是套尾。

那么表明了套索之后,大家便需求为套索的索尾赋值了,即数据源的那大器晚成方。 

代码里,我们经过Binding的Path和Source设置了索尾的数据源和数据源绑定的性质。之后我们还设置了绑定情势是双向绑定,即双方修改都会实行数据传递。

安装好了套索后,咱们在让TextBox控件本人转进套头里,并设置了TextBox控件绑定的属性。代码如下:

txtNameNotify.SetBinding(TextBox.TextProperty, bding);  

在大家TextBox控件本身转进套头里的时候,会对数据源的PropertyChanged举办赋值,那样我们就贯彻了字符串数据的传导。

理当如此,那样赋值看起来比较死板。那么有更轻松的点子吗。

答案当然是:有。

MVVM的根底运用

地点的代码已经达成了ViewModel,那么大器晚成旦在此个基础上开展优化,就可以兑现最简便易行的MVVM的利用。

优化Xaml代码如下:

<StackPanel> 
    <TextBox Name="txtNameNotify" Text="{Binding KName}" VerticalAlignment="Top"  Height="24" ></TextBox>
    <Button Click="Button_Click" Height="30" Content="查看结果"></Button>
</StackPanel>

优化Xaml.cs代码如下: 

 public partial class WindowNotify : Window
 {  
     public WindowNotify()
     {
         InitializeComponent();
         this.DataContext = new WindowNotifyViewModel(); 

     }
     private void Button_Click(object sender, RoutedEventArgs e)
     {
         var vm = this.DataContext as WindowNotifyViewModel;
         MessageBox.Show("[txtNameNotify:" + vm.KName + "]");
     } 
 }
 public class WindowNotifyViewModel : INotifyPropertyChanged
 {
     public event PropertyChangedEventHandler PropertyChanged;
     private string _KName = "Kiba518";
     public string KName
     {
         get { return _KName; }
         set
         { 
             _KName = value;
             if (this.PropertyChanged != null)
             {
                 this.PropertyChanged(this, new PropertyChangedEventArgs("KName"));
             }
         }
     }
 }

从上边的代码中,我们能够看出在Xaml文件中,Text属性能够选择{Binding
KName}这种简写的方式,来贯彻刚才丰富复杂的binding赋值。

而在Xaml.cs文件中,我们将VeiwMode赋值给了DataContext那个数目上下文,然后,我们就来看了,前台直接运用了VM里的性质。

这样简单的MVVM就贯彻了。

简洁的ViewModel

在上头我们看来了ViewModel的开创和选择,但ViewMode中每一个属性都要设置成如此复杂的造型,稍微有一点点难熬。

那便是说,我们来用CallerMemberName一而再简化那些ViewModel。

优化后的代码如下:

public class WindowNotifyViewModel : BaseViewModel
{ 
    private string _KName = "Kiba518";
    public string KName
    {
        get { return _KName; }
        set
        { 
            _KName = value;
            OnPropertyChanged(); 
        }
    }
}
public class BaseViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName]string propertyName = "")
    { 
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    } 
}

如上所示,我们定义了贰个BaseViewModel,并在BaseViewModel里面定义方法OnPropertyChanged,并在其间达成事件PropertyChanged的触发定义。

末段我们由此CallerMemberName性情,在方法OnPropertyChanged里来获取触发该方法的性质的称呼。

接下来大家就贯彻了,比较轻便的ViewModel。

PS:CallerMemberName的用法就恍如param参数同样,只要如上所示,写进去就可以。

结语

到此,消息的采纳就说完了。新闻一定是MVVM的本领焦点。学会音信才干越来越好的明亮MVVM。

再正是学会消息,还是能援救我们更加好的掌握明日风靡的前端JS的MVVM。就算完毕情势不一致样,但道理是一样的。

C#语法——元组类型

C#语法——泛型的两种用到

C#语法——await与async的没有错张开药情势

C#语法——委托,框架结构的血液

C#语法——事件,逐步边缘化的长兄。

我对C#的认知。


注:此作品为原创,接待转发,请在文章页面分明地点给出此文链接!
若您感到那篇小说勉强选择,请点击下右下角的【推荐】,极其多谢!
假设您以为这篇文章对您有所支持,那就不要紧支付宝小小打赏一下啊。 

图片 2

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website