zoukankan      html  css  js  c++  java
  • 【2016-10-24】【坚持学习】【Day11】【WPF】【MVVM】

    今天学习wpf的mvvm

    人家说,APS.NET ===>MVC

    WPF===>MVVM

    用WPF不用mvvm的话,不如用winform。。。

    哈哈,题外话。

    定义:

    MVVM:

    WPF的数据绑定与Presentation Model相结合是非常好的做法,使得开发人员可以将View和逻辑分离出来,但这种数据绑定技术非常简单实用,也是WPF所特有的,所以我们又称之为Model-View-ViewModel(MVVM)。这种模式跟经典的MVP(Model-View-Presenter)模式很相似,除了你需要一个为View量身定制的model,这个model就是ViewModel。ViewModel包含所有由UI特定的接口和属性,并由一个 ViewModel 的视图的绑定属性,并可获得二者之间的松散耦合,所以需要在ViewModel 直接更新视图中编写相应代码。数据绑定系统还支持提供了标准化的方式传输到视图的验证错误的输入的验证。

    model,数据模型,

    view,视图,界面

    viewmodel,视图模型,用来连接view,和model的中间的东东。

        public class Model 
        {
    
            public string Name { get; set; }
            public int Age { get; set; }
        }
    Mdoel
    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication1"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
           
            <Grid.ColumnDefinitions>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
    
            <ListBox x:Name="listBox" ItemsSource="{Binding Models}" DisplayMemberPath="Name" SelectedItem="{Binding SelectedModel,Mode=TwoWay}">
                
            </ListBox>
            <StackPanel Grid.Column="1" VerticalAlignment="Center">
                <TextBlock Text="名字"></TextBlock>
                <TextBox Text="{Binding SelectedModel.Name}"></TextBox>
                <TextBlock Text="年龄"></TextBlock>
                <TextBox Text="{Binding SelectedModel.Age}"></TextBox>
            </StackPanel>
          
        </Grid>
    </Window>
    View
     public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
    
                this.DataContext = new ViewModel();
            }
        }
    View behind Code
     public abstract class ViewModelBase : INotifyPropertyChanged
        {
            #region Property Changed Event Handler
            public void SetPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
            public event PropertyChangedEventHandler PropertyChanged;
            #endregion Property Changed Event Handler
        }
    
    
    
        public class ViewModel : ViewModelBase
        {
            public ObservableCollection<Model> Models { get; set; }
    
            private Model selectedModel;
    
            public Model SelectedModel
            {
                get { return selectedModel; }
                set
                {
                    selectedModel = value;
                    SetPropertyChanged("SelectedModel");
                }
            }
    
    
            public ViewModel()
            {
                Models = GetData();
            }
    
            public ObservableCollection<Model> GetData()
            {
                return GetDataFromDB();
            }
    
            private ObservableCollection<Model> GetDataFromDB()
            {
                ObservableCollection<Model> result = new ObservableCollection<Model>();
                for (int i = 0; i < 20; i++)
                {
                    result.Add(new Model()
                    {
                        Name = "Name" + i,
                        Age = i,
                    });
    
                }
                return result;
            }
        }
    ViewModel

    补充:

    其实可以不用在界面的behindcode 赋值DataContext,直接在界面引用。

     <Window.DataContext>
            <local:ViewModel/>
        </Window.DataContext>

    作者:zscmj
    出处:http://www.cnblogs.com/zscmj/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Warning: Cannot modify header information
    curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in
    PHP Warning: strtotime(): It is not safe to rely on the system's timezone settings.
    出现Deprecated: Function ereg_replace() is deprecated in 的原因及解决方法
    APMServ5.2.6 升级PHP版本 到高版本 5.3,5.4
    Apache无法启动解决 the requested operation has failed
    用json获取拉钩网的信息
    json
    如何用组件组装一个简单的机器人
    vue-组件
  • 原文地址:https://www.cnblogs.com/zscmj/p/5994712.html
Copyright © 2011-2022 走看看