Avalonia中如何将View事件映射到ViewModel层

前言

前面的文章里面我们有介绍在Wpf中如何在View层将事件映射到ViewModel层的文章,传送门,既然WPF和Avalonia是两套不同的前端框架,那么WPF里面实现模式肯定在这边就用不了,本篇我们将分享一下如何在Avalonia前端框架下面将事件映射到ViewModel层。本章内容还是在上一节的基础上做扩展讲解。Avalonia中使用Prism实现区域导航功能

安装行为扩展

在Avalonia框架下面有它自己的行为扩展,我们需要借助这些扩展库里面的行为扩展来实现我们今天要讲解的功能。

bash 复制代码
dotnet add package Avalonia.Xaml.Behaviors --version 11.0.5

编写View层的代码

我们先来一个简单的页面加载事件的触发,View层代码如下:

html 复制代码
<UserControl xmlns="https://github.com/avaloniaui"
             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:prism="http://prismlibrary.com/"
             xmlns:i="clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity"
             xmlns:ia="clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions"
             prism:ViewModelLocator.AutoWireViewModel="True"
             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
             x:Class="AvaloniaTest.Views.ViewB" Background="Green">
  <i:Interaction.Behaviors>
    <ia:EventTriggerBehavior EventName="Loaded">
      <ia:InvokeCommandAction Command="{Binding OnLoad}"></ia:InvokeCommandAction>
    </ia:EventTriggerBehavior>
  </i:Interaction.Behaviors>
  <StackPanel>
    <TextBlock Text="{Binding Title}"></TextBlock>
  </StackPanel>
</UserControl>
html 复制代码
             xmlns:i="clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity"
             xmlns:ia="clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions"

这段代码的意思是在头部引入了事件行为用到的两个命名空间Avalonia.Xaml.Interactivity和Avalonia.Xaml.Interactions。

html 复制代码
  <i:Interaction.Behaviors>
    <ia:EventTriggerBehavior EventName="Loaded">
      <ia:InvokeCommandAction Command="{Binding OnLoad}"></ia:InvokeCommandAction>
    </ia:EventTriggerBehavior>
  </i:Interaction.Behaviors>

这段代码的意思是我们给Interactivity的Interaction.Behaviors属性赋值,这里面我们用到了Avalonia.Xaml.Interactions里面的EventTriggerBehavior,字面意思是"事件触发行为",我们设置EventName属性为Loaded,这个是axalm的前端加载事件名称。

编写ViewModel层的代码

csharp 复制代码
using Prism.Commands;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AvaloniaTest.ViewModels
{
    public class ViewBViewModel : ViewModelBase, INavigationAware
    {
        private string _title = "ViewB";

        public string Title
        {
            get => _title;
            set
            {
                SetProperty(ref _title, value);
            }
        }
        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            return true;
        }

        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
        }

        public void OnNavigatedTo(NavigationContext navigationContext)
        {
        }

        private DelegateCommand _onLoad;
        public DelegateCommand OnLoad => _onLoad ?? (_onLoad=new DelegateCommand(() => {
            Debug.WriteLine("OnLoad is run!");
        }));
    }
}

相比较上一篇的内容,其实就多了一个命令属性OnLoad

运行程序查看效果,果然在导航页面加载的时候会进入该方法,完美。

相关推荐
time3 天前
适用于.net的操作excel的库
c#·.net·excel·avalonia
智汇IOT2 个月前
Avalonia跨平台上位机控件开发之水泵
c#·上位机·avalonia
zzlyx992 个月前
Avalonia环境如何安装及安装问题解决
avalonia
假装我不帅5 个月前
vscode开发avalonia
ide·vscode·编辑器·avalonia
lishuangquan19875 个月前
AvaloniaUI的学习
ui·avalonia
Setli5 个月前
.NET跨平台UI框架Avalonia 11.1重磅发布
.net·跨平台·avalonia
hoyho7 个月前
分享下最近基于Avalonia UI和MAUI写跨平台时间管理工具的体验
.net·maui·avalonia
czwy7 个月前
Avalonia中的线性渐变画刷LinearGradientBrush
wpf·xaml·avalonia
jason成都10 个月前
Avalonia学习(二十六)-桌面系统界面Ribbon
学习·ui·avalonia
jason成都10 个月前
Avalonia学习(二十五)-系统界面
学习·ui·avalonia