澳门至尊网站-首页

您的位置:澳门至尊网站 > 搜索引擎 > MVVM学习心德,MVVM的核心技术

MVVM学习心德,MVVM的核心技术

2019-10-20 12:47

在C#中新闻有五个针对,八个针对Message,八个针对INotify。这里根本讲INotify。

接触MVVM临近一段时间了,有一点接头,写下去。

INotify也可以有人称之为[通知],不管叫音信照旧公告,都以三个野趣,正是传递音信。

事先是做winform的,专门的职业索要,学习wpf。优劣势就毫无说类,网络第一次全国代表大会堆。笔者要好知道的话,有上边几点:

音讯的定义

1、首先是分界面包车型地铁xmal和分界面分离:wpf也如出风姿浪漫辙补助拖拉控件,不过使用wpf的人,皆以为在xmal中写控件更屌一点。而且能够动用静态财富(Window。Resources)设置每八个控件的体裁(Style),统风流浪漫分界面风格更有益。Style中的TargetType钦命属于某黄金时代类控件,Setter钦定属性(Property)和Value。

INotify音讯其实是叁个接口,接口名字为INotifyPropertyChanged。接口定义如下:

  如  <Style x:key="TxtBoxStyle" TargetType=“TextBox”>

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

      <Setter Property="Width"  Value="100" />

概念比极粗略,大家能够见见那么些接口只定义了多个平地风波性质——PropertyChanged。所以那几个PropertyChanged正是新闻的主导了。

    </Style>

那么学习运用新闻的办法就现身了,即,创设一个延续INotifyPropertyChanged接口的类,然后在类内,实现PropertyChanged就足以了。

  Style中还是能增添Template,然后放置越多的体裁模板。

音信的应用

2、数据绑定,能够说是MVVM的主导。分界面和后台的多寡交互代码,统统放置在VM(ViewModel)中,M(Model)中放置数据对象,如SQL数据库中的订单表,在Modle中正是叁个指标类。V(View)是分界面层。

上边介绍音讯是用来传递消息的。那么或然会有同学好奇,援用类型的靶子不就能够打包传递新闻吗?为啥还要用消息呢?

  近来做了三个DataGrid的数据绑定,列中放置了TextBox、ComboBox、Button的控件,使用数据绑定驱动控件。

因为微微数据是积累在非引用类型的目的中的。举个例子字符串,或数字等。

澳门至尊网站 1

为了让字符串、数字等数据的修改也能如引用类型同样,能够传递回给源,就须要利用新闻了。

DataGrid的Columns中央银行使DataGridTemplateColumn,能够放置Text博克斯等控件。并在TextBox中增加TextBoxChanged事件,引用(xmlns:ie=",

上边我们来看下音讯的底蕴用法。

<ie:Interaction.Trigger>

首先,大家应用WPF创造贰个项目,然后创制贰个页面,起名称叫WindowNotify,编辑内容如下:

澳门至尊网站,  <ie:EvenTrigger EventName="TextChanged">

<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>

    <ie:InvokeCommandAction Command="{Binding String,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" CommandParameter="String" />

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

 </ie:Interaction.Trigger>

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"));
            }
        }
    }
}

在Button中央市直机关接能够使用Command和CommandParameter,CommandParameter中得以应用ElementName传递任何控件到VM层。当然如此就违背了MVVM的筹算初级中学,然而要求情状下,也能够那样用。如在甄选了DataGrid的意气风发行中的Button,怎么着收获Button所在行的任何列的音信呢?把DataGrid传过去就很有利了,直接使用SelectedItem。当然也得以在V层 .cs代码中拿走后传递到VM层。

这里大家成立了三个ViewModel——WindowNotifyViewModel,大家让那一个VM承继INotifyPropertyChanged,然后定义了二个KName属性,并定义了PropertyChanged事件触发的职位。

在DataGrid绑定数据时,钦赐ItemsSource=“{Binding xxx}“,VM层中央银行使ObservableCollection<xxxModel> 集合,并设置OnPropertyChanged。DataGrid列中Binding对象xxModel中的属性就能够了。

有同学或者会惊叹,PropertyChanged事件是曾几何时被赋值的啊?别心急,请耐烦往下看。

诸如此比就可以在DataGrid中展现数据。不经常候那样Binding后要么不能够呈现数据,恐怕是Binding数据对象必要静态什么的。如ComboBox中绑定,那么些自家是设定类ComboBox类,当中有Value和Text及Guid属性,并在xxxModle(DataGrid数据源对象中)定义集合,并在聚集中增加值。并且Binding时那样写(别问为啥以,也是在网络找到代码):”{Binding xxxModel.xxxCbBox},RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=DataGrid},Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}“。

ViewModel定义完毕之后,大家再看Xaml对应的cs文件。这里大家也定义了一个KName属性。然后初步化时,将cs文件的KName和VM的KName分别赋值给前台定义的五个TextBox控件。

 

此地用vm的KName属性赋值时,稍微有一点极其,稍后再介绍。

Button的Visibility属性同样能够做Banding。

然后大家运营页面,并修改七个文本框内的值。再点击查看结果按键。获得分界面如下:

澳门至尊网站 2

能够从图中拜会,分界面修改了TextBox的Text属性,WindowNotifyViewModel的KName属性对修改的值进行了伙同,而WindowNotify的KName未有同台。

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

Binding bding = new Binding();

此处的Binding是绑定的情致,那行代码很分明是用来定义三个绑定。

绑定是个倒霉精通的词,大家该怎么驾驭吧?

很简短,大家得以将绑定驾驭为套索,既然是套索,那么就该有七个属性,一个是套头,三个是套尾。

那么评释了套索之后,大家便必要为套索的索尾赋值了,即数据源的那大器晚成方。 

代码里,大家通过Binding的Path和Source设置了索尾的数据源和数据源绑定的品质。之后大家还安装了绑定格局是双向绑定,即两侧修改都博览会开数量传递。

设置好了套索后,大家在让Text博克斯控件本身转进套头里,并安装了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#的认知。


注:此小说为原创,接待转载,请在篇章页面显然地点给出此文链接!
若你感到那篇文章还不易,请点击下右下角的【推荐】,非常感激!
若果你以为那篇文章对你抱有帮忙,那就不要紧支付宝小小打赏一下呢。 

澳门至尊网站 3

 

本文由澳门至尊网站发布于搜索引擎,转载请注明出处:MVVM学习心德,MVVM的核心技术

关键词: