MaterialDesign合集(第四章 DemoItem示范项目类)

目录

一 上章回顾 

二 继承视图模型基类

三 字段

四 构造方法

五 属性

六 方法

七 总结

八 下章预告


一 上章回顾 

一 上章回顾

二 实现INotifyPropertyChanged接口

三  属性变更委托

四 属性变更

五 设置属性

六 总结

七 下章预告


二 继承视图模型基类

便于元素调用属性变更通知委托

public class DemoItem : ViewModelBase


三 字段

内容类型

private readonly Type _contentType;

数据上下文
private readonly object? _dataContext;

内容对象

private object? _content;

水平滚动条可见性
private ScrollBarVisibility _horizontalScrollBarVisibilityRequirement;

垂直滚动条可见性
private ScrollBarVisibility _verticalScrollBarVisibilityRequirement = ScrollBarVisibility.Auto;

边距
private Thickness _marginRequirement = new(16);

通知数量

private int _notificationNumber = 0;


四 构造方法

接受传入的项目名、内容类型、枚举文档链接集合、选中图标、未选中图标和数据上下方并赋值

public DemoItem(string name, Type contentType, IEnumerable<DocumentationLink> documentation,
    PackIconKind selectedIcon, PackIconKind unselectedIcon, object? dataContext = null)
{
    Name = name;
    _contentType = contentType;
    _dataContext = dataContext;
    Documentation = documentation;
    SelectedIcon = selectedIcon;
    UnselectedIcon = unselectedIcon;
}


五 属性

项目名

 public string Name { get; }

枚举文档链接集合

 public IEnumerable<DocumentationLink> Documentation { get; }

内容对象

 public object? Content => _content ??= CreateContent();

选中图标

 public PackIconKind SelectedIcon { get; set; }

未选中图标
 public PackIconKind UnselectedIcon { get; set; }

通知属性,如果通知数量为0,不显示,如果小于100显示具体数值,如果大于100显示99+

 public object? Notifications
 {
     get
     {
         if (_notificationNumber == 0) return null;
         else return _notificationNumber < 100 ? _notificationNumber : "99+";
     }
 }

水平滚动条可见性

 public ScrollBarVisibility HorizontalScrollBarVisibilityRequirement
 {
     get => _horizontalScrollBarVisibilityRequirement;
     set => SetProperty(ref _horizontalScrollBarVisibilityRequirement, value);
 }

垂直滚动条可见性

 public ScrollBarVisibility VerticalScrollBarVisibilityRequirement
 {
     get => _verticalScrollBarVisibilityRequirement;
     set => SetProperty(ref _verticalScrollBarVisibilityRequirement, value);
 }

边距厚度

 public Thickness MarginRequirement
 {
     get => _marginRequirement;
     set => SetProperty(ref _marginRequirement, value);
 }


六 方法

创建内容方法,创建内容类型的实例,如果数据上下文不为空且内容类型属于框架元素类型,将构造函数接受的数据上下文赋给该内容实例的数据上下文属性

private object? CreateContent()
{
    var content = Activator.CreateInstance(_contentType);
    if (_dataContext != null && content is FrameworkElement element)
    {
        element.DataContext = _dataContext;
    }

    return content;
}

增加新通知方法,增加通知数量并触发属性变更方法

public void AddNewNotification()
{
    _notificationNumber++;
    OnPropertyChanged(nameof(Notifications));
}

忽略全部通知方法,重置通知属性并触发属性变更方法

public void DismissAllNotifications()
{
    _notificationNumber = 0;
    OnPropertyChanged(nameof(Notifications));
}


七 总结

以上就是MaterialDesign中DemoItem类的介绍,本文仅仅简单介绍了DemoItem的作用,而实际使用时可以扩展到各种类型的用户控件,只需要按照该模版开发,均实现通知属性变更功能,双向绑定UI后,可自动即使更新UI显示,非常便捷高效。


八 下章预告

下一章我会教大家如何实现AnotherCommandImplementation 另一种命令实现类,实现ICommand接口,根据自身需要自定义命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值