目录
一 上章回顾
一 上章回顾
二 实现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接口,根据自身需要自定义命令