zoukankan      html  css  js  c++  java
  • C#中WVVM的使用

    学习WVVM模式,设计一个简单的菜单显示和选择时显示个数的一个例子。

    最终效果:

    所建文件结构如下:

    MenuModel:菜品属性-名称和价格

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace WpfApplication2.Model
    {
       public class MenuModel
        {
            public string Name { get; set; }
            public string Price { get; set; }
    
        }
    }

    DelegateCommend:命令属性

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Input;
    
    namespace WpfApplication2.Model
    {
       public class DelegateCommend:ICommand
        {
            public Action<object> ExecuteAction { get; set; }
            public Func<object,bool> CanExecuteFunc { get; set; }
            public bool CanExecute(object parameter)
            {
                if (CanExecuteFunc==null)
                return true;
                return CanExecuteFunc(parameter);
            }
    
            public event EventHandler CanExecuteChanged;
    
            public void Execute(object parameter)
            {
                if (ExecuteAction == null)
                    return;
                ExecuteAction(parameter);
            }
        }
    }

    DishService:初始化菜品集合

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using WpfApplication2.Model;
    
    namespace WpfApplication2.Servers
    {
       public class DishService
        {
           public List<ListMenuModel> GetDishes()
           {
               List<ListMenuModel> list = new List<ListMenuModel>();
               list.Add(new ListMenuModel {Dishes= new MenuModel{Name = "黄瓜", Price = "8" },IsSelected=false});
               list.Add(new ListMenuModel { Dishes = new MenuModel { Name = "酸菜", Price = "5" }, IsSelected = false });
               list.Add(new ListMenuModel { Dishes = new MenuModel { Name = "拉皮", Price = "7" }, IsSelected = false });
               list.Add(new ListMenuModel { Dishes = new MenuModel { Name = "凉粉", Price = "6" }, IsSelected = false });
               list.Add(new ListMenuModel { Dishes = new MenuModel { Name = "豆芽", Price = "3" }, IsSelected = false });
               list.Add(new ListMenuModel { Dishes = new MenuModel { Name = "京皮", Price = "5" }, IsSelected = false });
               return list;
           }
        }
    }

    ListMenuModel:界面中菜品和选择复选框的viewmodel,具有通知功能

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    
    namespace WpfApplication2.Model
    {
        public class ListMenuModel:INotifyPropertyChanged
        {
            public MenuModel Dishes { get; set; }
            private bool isSelected;
    
            public bool IsSelected
            {
                get { return isSelected; }
                set { isSelected = value;
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("IsSelected"));
                }
            }
            
    
            public event PropertyChangedEventHandler PropertyChanged;
        }
    }

    MainViews:界面所有数据绑定的源

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using WpfApplication2.Model;
    using WpfApplication2.Servers;
    
    namespace WpfApplication2.Views
    {
       public class MainViews:INotifyPropertyChanged
        {
            public DelegateCommend SelectCmd { get; set; }
    
            private List<ListMenuModel> dishes;
    
            public List<ListMenuModel> Dishes
            {
                get { return dishes; }
                set { dishes = value;
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("Dishes"));
                }
            }
    
            private int count;
    
            public int Count
            {
                get { return count; }
                set { count = value;
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("Count"));
                }
            }
    
           
           public MainViews()
           {
               Dishes = (new DishService()).GetDishes();
    
               SelectCmd = new DelegateCommend();
    
               SelectCmd.ExecuteAction = x =>
               {
                   this.Count = Dishes.Where(n => n.IsSelected == true).Count();
               };
           }
    
           public event PropertyChangedEventHandler PropertyChanged;
        }
    
    }

    MainWindow.xaml:界面

    <Window x:Class="WpfApplication2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
    
            <Border CornerRadius="6" Background="Yellow" BorderThickness="3" BorderBrush="Orange" Margin="0,0,0.4,-0.2" Grid.RowSpan="3">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="auto"/>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="auto"/>
                    </Grid.RowDefinitions>
                    <Border BorderThickness="1" BorderBrush="Orange" Padding="4" CornerRadius="6">
                        <StackPanel>
                            <StackPanel.Effect>
                                <DropShadowEffect Color="LightBlue"></DropShadowEffect>
                            </StackPanel.Effect>
                            <TextBlock Text="欢迎光临!" FontSize="30"></TextBlock>
                        </StackPanel>
                    </Border>
    
                    <DataGrid Name="dishGrid" Grid.Row="1" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" GridLinesVisibility="None">
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="菜名" Binding="{Binding Dishes.Name}"></DataGridTextColumn>
                            <DataGridTextColumn Header="价格" Binding="{Binding Dishes.Price}"></DataGridTextColumn>
                            <DataGridTemplateColumn >
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <CheckBox IsChecked="{Binding IsSelected,UpdateSourceTrigger=PropertyChanged}" Command="{Binding DataContext.SelectCmd,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}}}"></CheckBox>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                        </DataGrid.Columns>
    
                    </DataGrid>
    
    
                    <StackPanel Grid.Row="2" HorizontalAlignment="Right" Orientation="Horizontal" Margin="5">
                        <TextBlock Text="共计" FontSize="16 "></TextBlock>
                        <TextBox IsReadOnly="True" Width="50" Text="{Binding Count}"></TextBox>
                        <Button Content="下单" Height="24"  Width="120"></Button>
                    </StackPanel>
                </Grid>
            </Border>
        </Grid>
    </Window>

    其C#代码如下:设置数据及绑定

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using WpfApplication2.Model;
    using WpfApplication2.Servers;
    using WpfApplication2.Views;
    namespace WpfApplication2
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
    
                MainViews mw = new MainViews();
    
                this.DataContext = mw;
                dishGrid.ItemsSource = mw.Dishes;
    
            }
        }
    }
  • 相关阅读:
    wireshark1
    攻防世界Crypto高手进阶区部分Writeup
    flag_in_your_hand1
    扩展GridView之添加单选列
    C#关于日期月天数和一年有多少周及某年某周时间段的计算
    C# 开发和使用中的32个技巧
    TSQL编程的全局变量
    计算当前月底天数
    存储过程编写经验和优化措施
    ASP.NET 程序中常用的三十三种代码
  • 原文地址:https://www.cnblogs.com/lunawzh/p/5840417.html
Copyright © 2011-2022 走看看