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的源码及更加详尽的介绍。

相关推荐
为自己_带盐1 小时前
在 Blazor Server 中集成 docx-preview.js 实现高保真 Word 预览
javascript·c#·word
hixiong1232 小时前
C# OpenvinoSharp部署DDDDOCR验证码识别模型
opencv·c#·ocr·openvino
唐青枫2 小时前
C#.NET ConcurrentBag<T> 设计原理与使用场景
c#·.net
玩泥巴的11 小时前
飞书 .NET SDK 事件处理的幂等性与去重机制
c#·.net·二次开发·飞书
在路上看风景12 小时前
3.2 FileStream
c#
zwm26988881512 小时前
6号楼 部分声光24v电压达不到,显示11v
c#
椒颜皮皮虾16 小时前
TensorRtSharp:在 C# 世界中释放 GPU 推理的极致性能
c#·tensorrt
行止9516 小时前
WinForms 彻底隐藏 滚动条的终极解决方案
c#
bugcome_com16 小时前
WPF样式进阶实战:外置样式+MVVM主题切换+样式优先级全解析
c#·.net·wpf