WPF简单菜单的MVVM绑定

WPF简单菜单的MVVM绑定

一、项目文件框架:
在这里插入图片描述
二、添加两个Nuget库:MaterialDesignThemes和MaterialDesignColors;
在这里插入图片描述
三、在App.xaml中添加MaterialDesignInXaml样式;

<Application x:Class="WPF0616A.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WPF0616A"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Dark.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.Blue.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.LightBlue.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

四、Models中两个实体类:
文件【ItemCount.cs】,定义菜单项右侧的新文件显示个数及显示背景色:

public class ItemCount
    {
        public Brush Color { get; private set; }
        public int Value { get; private set; }

        public ItemCount(Brush color, int value)
        {
            Color = color;
            Value = value;
        }
    }

文件【MenuItem.cs】,定义菜单项展示的名称、图片、新文件信息:

 public class MenuItem
    {
        public String Name { get; private set; }
        public PackIconKind Icon { get; private set; }
        public ItemCount Count { get; private set; }

        public MenuItem(String name, PackIconKind icon, ItemCount count)
        {
            Name = name;
            Icon = icon;
            Count = count;
        }
    }

五、ViewModels
文件【MainViewModel.cs】,只定义了简单的几个属性:窗体展示Logo、菜单绑定列表。属性定义比较简单,因为视图MainView.xaml展示内容不多:

using MaterialDesignThemes.Wpf;
using MenuMVVM.Models;
using System.Collections.Generic;
using System.Windows.Media;

namespace MenuMVVM.ViewModels
{
    public class MainViewModel
    {
        public string Logo { get; set; }
        public List<MenuItem> LeftMenus { get; set; }
        public MainViewModel()
        {
            Logo = "https://img.dotnet9.com/logo-foot.png";

            LeftMenus = new List<MenuItem>();
            LeftMenus.Add(new MenuItem("图片", PackIconKind.Image, new ItemCount(Brushes.Black, 2)));
            LeftMenus.Add(new MenuItem("音乐", PackIconKind.Music, new ItemCount(Brushes.DarkBlue, 4)));
            LeftMenus.Add(new MenuItem("视频", PackIconKind.Video, new ItemCount(Brushes.DarkGreen, 7)));
            LeftMenus.Add(new MenuItem("文档", PackIconKind.Folder, new ItemCount(Brushes.DarkOrange, 9)));
        }
    }
}

六、主窗体xaml代码:

<Window x:Class="WPF0616A.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:WPF0616A"
        xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
        mc:Ignorable="d"
        Title="MainForm" Height="600" Width="1080" Background="#FF36235F" MouseLeftButtonDown="Window_MouseLeftButtonDown"
        WindowStyle="None" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
    <Grid>
        <StackPanel Width="200" HorizontalAlignment="Left" Background="#FF472076">
            <Grid Height="150" Background="White">
                <Image Source="{Binding Logo}"/>
            </Grid>
            <ListView ItemsSource="{Binding LeftMenus}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" Height="30">
                            <materialDesign:PackIcon Kind="{Binding Path=Icon}" Width="20" Height="20" VerticalAlignment="Center"/>
                            <TextBlock Text="{Binding Path=Name}" Margin="20 0" FontSize="15" VerticalAlignment="Center"/>
                            <Grid VerticalAlignment="Center">
                                <Rectangle Width="30" Height="15" RadiusY="7.15" RadiusX="7.15" Fill="{Binding Path=Count.Color}" Stroke="White" StrokeThickness="0.7"/>
                                <TextBlock Text="{Binding Path=Count.Value}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="9"/>
                            </Grid>
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </StackPanel>
    </Grid>
</Window>

后台代码:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new MainViewModel();
        }

        private void Window_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            DragMove();
        }
    }

七、运行效果:
在这里插入图片描述
引用原文:https://blog.csdn.net/HenryMoore/article/details/103995691

WPF(Windows Presentation Foundation)是一种用于构建Windows桌面应用程序的框架,折叠菜单是其中的一种常见UI控件,用于在菜单项上实现折叠和展开效果,多级MVVM(Model-View-ViewModel)则是一种在WPF中组织和管理数据、界面和业务逻辑的架构模式。 在WPF中,折叠菜单可以通过TreeView控件实现。TreeView控件可用于显示树形数据结构,通过设置各个菜单项的父子关系,可实现多级折叠菜单。通过MVVM架构,可以将数据、界面和业务逻辑进行解耦,使得代码易于维护和测试。 在多级MVVM中,ViewModel层负责与数据交互,负责管理View层需要显示的数据,并提供与业务逻辑相关的方法。View层负责显示界面和处理用户交互,通过绑定ViewModel中的属性和命令,实现数据的展示和用户操作的响应。Model层则用于封装业务数据和逻辑,与其他层进行数据交互。 在折叠菜单的多级MVVM中,可以通过ViewModel的层级关系来管理菜单的展开和折叠状态。每个菜单项对应一个ViewModel,通过设置ViewModel之间的父子关系,实现上下级菜单的联动效果。通过绑定ViewModel的属性来实现菜单的展开和折叠状态的变化。 总之,通过使用WPF提供的TreeView控件和MVVM架构,我们可以实现折叠菜单的多级展开和折叠效果。这种架构模式能够使得代码结构清晰,易于扩展和维护,并提供良好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值