WINUI——Behavior(行为)小结

前言

在使用MVVM进行WINUI或WPF开发时,Command在某些时候并不能满足逻辑与UI分离的要求。这时肯定就需要其它技术的支持,Behavior就是一种。在WPF中是有Behavior直接支持的,转到WINUI后,相对有一些麻烦,于是在此记录之,以备忘。

开发环境

WIN11

VS2022

Nuget包:Microsoft.Xaml.Behaviors.WinUI.Managed

如何使用Behavior?

1. 首先安装Microsoft.Xaml.Behaviors.WinUI.Managed

当前(2024/6/6)的最新版本为2.0.9。

2. 在需要使用的Page引用InteractivityInteractions

xmlns:Interactivity="using:Microsoft.Xaml.Interactivity"

xmlns:Interactions="using:Microsoft.Xaml.Interactions.Core"

3. 在需要的控件添加相应的Behavior

以下以InvokeCommandAction (即是调用VM中的Command)为示例,更多详细操作可参见Github相应文档,链接为:InvokeCommandAction · microsoft/XamlBehaviors Wiki · GitHub

XML 复制代码
<Button x:Name="button1">
    <Interactivity:Interaction.Behaviors>
        <Interactions:EventTriggerBehavior EventName="Click" SourceObject="{Binding ElementName=button1}">
            <Interactions:InvokeCommandAction Command="{Binding UpdateCountCommand}"/>
        </Interactions:EventTriggerBehavior>
    </Interactivity:Interaction.Behaviors>
</Button>

若调用的Command有参数时,参数添加示例如下:

XML 复制代码
<Interactions:InvokeCommandAction Command="{x:Bind ViewModel.UserNameChangedCommand}" 
CommandParameter="{Binding ElementName=UserNameTextBox, Path=Text}" />

Behavior添加注意事项:

若有参数时,请一定要在控件的Content内添加Behavior,不可将它的Behavior添加到集中管理的Behaviors中。

如将UserNameTextBox的Behavior添加到下述的Behaviors,那么它的的参数CommandParameter可能就会获取不到。

XML 复制代码
 <Interactivity:Interaction.Behaviors>
        <Interactions:EventTriggerBehavior EventName="TextChanged" SourceObject="{Binding ElementName=UserNameTextBox}">
            <Interactions:InvokeCommandAction Command="{Binding UserNameChangedCommand}" CommandParameter="{Binding ElementName=UserNameTextBox, Path=Text}" />
        </Interactions:EventTriggerBehavior>
        <Interactions:EventTriggerBehavior EventName="Load" SourceObject="{Binding ElementName=TestPage}">
            <Interactions:InvokeCommandAction Command="{Binding PageLoadCommand}"/>
        </Interactions:EventTriggerBehavior>
    </Interactivity:Interaction.Behaviors>

原因可能是集中管理的Behaviors在所在层的可视化树上找不到UserNameTextBox这个SourceObject,于是就不能正确获取到它的文本。此后续弄清原因再做更新......

参考链接:

GitHub - microsoft/XamlBehaviors: This is the official home for UWP XAML Behaviors on GitHub.

以上链接为XamlBehaviors的仓库地址,及引入Microsoft.Xaml.Behaviors.WinUI.Managed的源码及更加详尽的介绍。

相关推荐
yngsqq37 分钟前
(for 循环) VS (LINQ) 性能比拼 ——c#
c#·solr·linq
想做后端的小C1 小时前
C# 面向对象 构造函数带参无参细节解析
开发语言·c#·面向对象
炯哈哈1 小时前
【上位机——WPF】App.xml和Application类简介
xml·开发语言·c#·wpf·上位机
bestcxx1 小时前
c# UTC 时间赋值注意事项
c#·utc
酷炫码神1 小时前
C#运算符
开发语言·c#
zybsjn2 小时前
后端系统做国际化改造,生成多语言包
java·python·c#
敲代码的 蜡笔小新3 小时前
【行为型之迭代器模式】游戏开发实战——Unity高效集合遍历与场景管理的架构精髓
unity·设计模式·c#·迭代器模式
yc_12244 小时前
SqlHelper 实现类,支持多数据库,提供异步操作、自动重试、事务、存储过程、分页、缓存等功能。
数据库·c#
Kookoos4 小时前
Redis + ABP vNext 构建分布式高可用缓存架构
redis·分布式·缓存·架构·c#·.net
Zhen (Evan) Wang6 小时前
ABP-Book Store Application中文讲解 - Part 2: The Book List Page
c#