WPF MVVM窗体设计基础

    WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。

    MVVM是Model-View-ViewModel的简写。它就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。微软的WPF带来了新的技术体验,如Silverlight、音频视频3D动画……,这导致了软件UI层更加细节化、可定制化。同时,在技术层面,WPF也带来了 诸如Binding、Dependency Property、Routed Events、Command、DataTemplate、ControlTemplate等新特性。MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构框架。它立足于原有MVP框架并且把WPF的新特性糅合进去,以应对客户日益复杂的需求变化。

  • 窗口事件

1.窗口事件注册

public class WindowBehaviours : Behavior<Window>
    {
        public static readonly DependencyProperty CloseProperty =
          DependencyProperty.Register(
          "Close",
          typeof(bool),
          typeof(WindowBehaviours),
          new FrameworkPropertyMetadata(
                    false,
                    OnCloseChanged));

        public bool Close
        {
            get { return (bool)GetValue(CloseProperty); }
            set { SetValue(CloseProperty, value); }
        }

        private static void OnCloseChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var window = ((WindowBehaviours)d).AssociatedObject;
            var newValue = ((bool)e.NewValue);
            if (newValue)
            {
                window.Close();
            }
        }


        public static readonly DependencyProperty ShowInTaskbarProperty =
          DependencyProperty.Register(
          "IsShowInTaskbar",
          typeof(bool),
          typeof(WindowBehaviours),
          new FrameworkPropertyMetadata(
                    false,
                    OnIsShowInTaskbarChanged));

        public bool IsShowInTaskbar
        {
            get { return (bool)GetValue(ShowInTaskbarProperty); }
            set { SetValue(ShowInTaskbarProperty, value); }
        }

        private static void OnIsShowInTaskbarChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var window = ((WindowBehaviours)d).AssociatedObject;
            var newValue = ((bool)e.NewValue);
            window.ShowInTaskbar = newValue;
        }
    }

2.窗口事件使用

<Window x:Class="BookStore.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:BookStore.Vm"
        xmlns:event="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    Title="欢迎使用图书商城" Height="300" Width="425" WindowStartupLocation="CenterScreen" Icon="pack://siteoforigin:,,,/Resources/smartATE.ico" WindowStyle="ToolWindow" ResizeMode="NoResize">
    <event:Interaction.Behaviors>
        <local:WindowBehaviours Close="{Binding IsWinClose}"/>
        <local:WindowBehaviours IsShowInTaskbar="{Binding IsShowInTaskbar}"/>
    </event:Interaction.Behaviors>
</Window>

数据绑定

        <TextBlock Grid.Column="1" Margin="0" Grid.Row="1" TextWrapping="Wrap" Width="auto" Text="用户" TextAlignment="Center" />
        <TextBlock Grid.Column="1" Margin="0" Grid.Row="3" Grid.RowSpan="1" TextWrapping="Wrap" Width="auto" Text="密码" TextAlignment="Center" />
        <TextBox Grid.Column="2"  Margin="0" Grid.Row="1" Grid.RowSpan="1" TextWrapping="Wrap" Text="{Binding UserID}" Width="auto"/>
        <PasswordBox Grid.Column="2"  Margin="0" Grid.Row="3" Grid.RowSpan="1" local:PasswordBoxHelper.Attach ="True" Name="pwd"
                      local:PasswordBoxHelper.Password ="{Binding Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

密码框绑定辅助类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;

namespace BookStore.Vm
{
    public static class PasswordBoxHelper
    {

        public static readonly DependencyProperty PasswordProperty = DependencyProperty.RegisterAttached("Password", typeof(string), typeof(PasswordBoxHelper), 
                                                                                                          new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));
        public static readonly DependencyProperty AttachProperty = DependencyProperty.RegisterAttached("Attach", typeof(bool), typeof(PasswordBoxHelper), new PropertyMetadata(false, OnAttachPropertyChanged));

        private static readonly DependencyProperty IsUpdatingProperty = DependencyProperty.RegisterAttached("IsUpdating", typeof(bool), typeof(PasswordBoxHelper));


        public static void SetAttach(DependencyObject dp, bool value)
        {
            dp.SetValue(AttachProperty, value);
        }

        public static bool GetAttach(DependencyObject dp)
        {
            return (bool)dp.GetValue(AttachProperty);
        }

        public static string GetPassword(DependencyObject dp)
        {
            return (string)dp.GetValue(PasswordProperty);
        }

        public static void SetPassword(DependencyObject dp, string value)
        {
            dp.SetValue(PasswordProperty, value);
        }

        private static bool GetIsUpdating(DependencyObject dp)
        {
            return (bool)dp.GetValue(IsUpdatingProperty);
        }

        private static void SetIsUpdating(DependencyObject dp, bool value)
        {
            dp.SetValue(IsUpdatingProperty, value);
        }

        private static void OnPasswordPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            PasswordBox passwordBox = sender as PasswordBox;
            passwordBox.PasswordChanged -= PasswordChanged;
            if (!(bool)GetIsUpdating(passwordBox))
            {
                passwordBox.Password = (string)e.NewValue;
            }
            passwordBox.PasswordChanged += PasswordChanged;
        }

        private static void OnAttachPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            PasswordBox passwordBox = sender as PasswordBox;
            if (passwordBox == null)
            {
                return;
            }               
            if ((bool)e.OldValue)
            {
                passwordBox.PasswordChanged -= PasswordChanged;
            }
            if ((bool)e.NewValue)
            {
                passwordBox.PasswordChanged += PasswordChanged;
            }
        }

        private static void PasswordChanged(object sender, RoutedEventArgs e)
        {
            PasswordBox passwordBox = sender as PasswordBox;
            SetIsUpdating(passwordBox, true);
            SetPassword(passwordBox, passwordBox.Password);
            SetIsUpdating(passwordBox, false);
        }
    }
}

按钮事件绑定


            <Button Content="登录" Width="auto" Margin="0" Grid.Column="1" Command="{Binding LoginCommand}"/>
            <Button Content="取消" Width="auto" Margin="0" Grid.Column="3" Command="{Binding CancelCommand}" />

后台代码

using BookStore.View;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace BookStore.ViewMode
{
    public class Vm_MainWindow : ViewModelBase
    {
        public Vm_MainWindow()
        {
            LoginCommand = new RelayCommand(ProcessLogin);
            CancelCommand = new RelayCommand(ProcessCancel);
        }

        public void ProcessLogin()
        {
            if (UserID == "Admin" && Password == "123")
            {
                IsShowInTaskbar = false;
                Tip = "";
                WindowBookStore wi = new WindowBookStore();
                //wi.Owner = this;
                wi.ShowDialog();
            }
            else
                Tip = "用户名或密码错误";
        }
        public void ProcessCancel()
        {
            IsWinClose = true;
        }
        #region

        private ICommand _loginCommand;

        public ICommand LoginCommand
        {
            get { return _loginCommand; }
            set { _loginCommand = value; }
        }


        private ICommand _cancelCommand;

        public ICommand CancelCommand
        {
            get { return _cancelCommand; }
            set { _cancelCommand = value; }
        }
        private bool _isWinClose;
        /// <summary>
        /// 指示窗口是否关闭
        /// </summary>
        public bool IsWinClose
        {
            get { return _isWinClose; }
            set
            {
                _isWinClose = value;
                RaisePropertyChanged("IsWinClose");

                //窗口关闭则重置窗口状态
                if (IsWinClose)
                {
                    ResetWindowCloseState();
                }
            }
        }

        //重置窗口状态
        private void ResetWindowCloseState()
        {
            IsWinClose = false;
        }

        private string _userID = "Admin";

        public string UserID
        {
            get { return _userID; }
            set
            {
                _userID = value;
                RaisePropertyChanged("UserID");
            }
        }


        private string _password = "123";

        public string Password
        {
            get { return _password; }
            set
            {
                _password = value;
                RaisePropertyChanged("Password");
            }
        }


        private string _Tip;

        public string Tip
        {
            get { return _Tip; }
            set
            {
                _Tip = value;
                RaisePropertyChanged("Tip");
            }
        }

        #region IsShowInTaskbar

        private bool _IsShowInTaskbar = true;

        public bool IsShowInTaskbar
        {
            get { return _IsShowInTaskbar; }
            set
            {
                _IsShowInTaskbar = value;
                RaisePropertyChanged("IsShowInTaskbar");
            }
        }


        #endregion
        #endregion
    }
}

前台代码

<Window x:Class="BookStore.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:BookStore.Vm"
        xmlns:event="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    Title="欢迎使用图书商城" Height="300" Width="425" WindowStartupLocation="CenterScreen" Icon="pack://siteoforigin:,,,/Resources/smartATE.ico" WindowStyle="ToolWindow" ResizeMode="NoResize">
    <event:Interaction.Behaviors>
        <local:WindowBehaviours Close="{Binding IsWinClose}"/>
        <local:WindowBehaviours IsShowInTaskbar="{Binding IsShowInTaskbar}"/>
    </event:Interaction.Behaviors>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="95*"/>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="57*"/>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="57*"/>
            <RowDefinition Height="31*"/>
            <RowDefinition Height="45*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="50*"/>
            <ColumnDefinition Width="60*"/>
            <ColumnDefinition Width="120*"/>
            <ColumnDefinition Width="50*"/>
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="1" Margin="0" Grid.Row="1" TextWrapping="Wrap" Width="auto" Text="用户" TextAlignment="Center" />
        <TextBlock Grid.Column="1" Margin="0" Grid.Row="3" Grid.RowSpan="1" TextWrapping="Wrap" Width="auto" Text="密码" TextAlignment="Center" />
        <TextBox Grid.Column="2"  Margin="0" Grid.Row="1" Grid.RowSpan="1" TextWrapping="Wrap" Text="{Binding UserID}" Width="auto"/>
        <PasswordBox Grid.Column="2"  Margin="0" Grid.Row="3" Grid.RowSpan="1" local:PasswordBoxHelper.Attach ="True" Name="pwd"
                      local:PasswordBoxHelper.Password ="{Binding Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>        
        <Grid Grid.ColumnSpan="2" Grid.Column="1" Height="auto" Margin="0" Grid.Row="5" Grid.RowSpan="1"  Width="auto">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="50*"/>
                <ColumnDefinition Width="60*"/>
                <ColumnDefinition Width="40*"/>
                <ColumnDefinition Width="50*"/>
                <ColumnDefinition Width="50*"/>
            </Grid.ColumnDefinitions>
            <Button Content="登录" Width="auto" Margin="0" Grid.Column="1" Command="{Binding LoginCommand}"/>
            <Button Content="取消" Width="auto" Margin="0" Grid.Column="3" Command="{Binding CancelCommand}" />
        </Grid>
        <Label Content="{Binding Tip}" Grid.Column="1" Margin="0" Grid.Row="4" Grid.ColumnSpan="2" Width="auto" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Foreground="#FFB20808" />

    </Grid>
</Window>

DataGrid选择行颜色设置

                        <DataGrid.Resources>
                            <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="#FF7ECB7E"/>
                            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FF72DBE0"/>
                        </DataGrid.Resources>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@David Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值