将UWP页面的加载/加载完成绑定到MVVM命令

5

最好使用PRISM(Prism.Core 6.2,Prism.Windows 6.02)编写,但我也想知道如何在UWP中使用普通MVVM将Command绑定到页面加载/已加载事件上,不需要使用Prism。

在WPF中,可以通过以下方式实现:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Loaded">
        <i:InvokeCommandAction Command="{Binding LoadedCommand}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>

在 ViewModel 中

public ICommand LoadedCommand { get; private set; }
public TheViewModelConstructor()
{
     LoadedCommand = new DelegateCommand(Load);
}
private async void Load()
{
    // Do stuff
}

但是在UWP中,System.Windows.Interactivity不存在。只需使用绑定即可。
Loaded="{Binding LoadedCommand}"

或者
Loading="{Binding LoadingCommand}"

将会得到编译错误 "Object reference not set an instance of an object"。

我想这样做的原因是因为有一个异步方法需要在页面加载期间或之后完成(不能在ViewModel构造函数中完成)。我可以很容易地在代码后台完成,但这不是MVVM。

如何正确绑定此命令?


你在异步方法中使用了哪个事件,这些方法在页面出现在UI后被调用?我尝试了类似于答案解决方案的loaded事件,但是当我导航到一个屏幕时,它仍然会挂起2-3秒钟,然后页面显示带有加载异步数据的UI。为什么会这样发生? - xyzWty
1个回答

6

在UWP中也提供了行为(Behaviors)功能。只需添加Microsoft.Xaml.Behaviors.Uwp.Managed包,就可以开始使用。

Microsoft.Xaml.Behaviors.Uwp.Managed v1.x

<interactivity:Interaction.Behaviors>
    <core:EventTriggerBehavior EventName="Loaded">
        <core:InvokeCommandAction Command="{Binding ViewLoadedCommand}" />
    </core:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>

Microsoft.Xaml.Behaviors.Uwp.Managed v2.x

<interactivity:Interaction.Behaviors>
    <core:EventTriggerBehavior EventName="Loaded">
        <core:EventTriggerBehavior.Actions>
            <core:InvokeCommandAction Command="{Binding ViewLoadedCommand}" />
        </core:EventTriggerBehavior.Actions>
    </core:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>

它可以工作,但在“core:InvokeCommandAction”之前应该有“core:EventTriggerBehavior.Actions”。您能否在我将其标记为接受答案之前修复它? - kurakura88
你说得对,这似乎是版本1.x(我们仍在使用)和2之间的变化。我已经在我的答案中都发布了。 - Bart
使用CommandParameter时,它总是返回null。有什么帮助吗? - Zea Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接