gpt4 book ai didi

windows-phone-7 - MVVM 如何摆脱代码隐藏事件

转载 作者:行者123 更新时间:2023-12-02 02:06:08 25 4
gpt4 key购买 nike

在查看了一些 MVVM 工具包(MVVM Light、SimpleMVVM)之后,共同的主题似乎是尝试使用尽可能多的可混合事件而不是使用代码隐藏。

我不确定如何完成所有事件。例如,在执行 Windows Phone 7 时绑定(bind)了 2 个事件。

  1. OnNavigatedTo/From
  2. 加载中

有没有人有关于如何在 MVVM 中执行此操作的示例?我正在使用 SimpleMVVM,但我希望示例可能相似,也许 MVVM light 工具包或什至只是一般的 MVVM 教程显示这可能会有所帮助。

我只找到了显示如何像点击按钮那样做的。

编辑

我对何时使用事件隐藏代码或使用混合事件命令感到困惑。

例如,在 MVVM Light 教程中,他们使用 MVVM 进行导航,但为什么这比使用代码隐藏事件更好?

当人们说我现在也有点困惑

Codebehind isn't evil; its the mix of business logic and codebehind that is problematic. Let your UI handle UI tasks in your codebehind.

好吧,在 MVVM light 示例中,他们在其中一个示例中有“忙”,其中当列表或它是什么(忘记)正在加载“加载标志出现”时。这一切都是在 ViewModel 中完成的,而不是代码隐藏事件。

所以这对我来说似乎有点矛盾(也许我遗漏了什么)。同样让我困惑的是,如果 ViewModel 对加载一无所知,你怎么知道加载何时开始或完成?

最佳答案

正如 HighCore 评论的那样,使用 EventToCommand。它使用起来非常简单,尽管您首先需要 Blend SDK。

...
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.SL4"
xmlns:im="clr-namespace:Microsoft.Expression.Interactivity.Media;assembly=Microsoft.Expression.Interactions"
xmlns:ic="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions"
...
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<cmd:EventToCommand Command="{Binding GetTweetsCommand}" CommandParameter="Twitter" />
</i:EventTrigger>
</i:Interaction.Triggers>

此外,只是关于代码隐藏的一般观点:在代码隐藏中拥有与 UI 相关的功能并不是世界上最糟糕的事情!它与您的 ViewModel 是分开的,并且位于合乎逻辑的位置。但是,我发现行为更容易测试。例如,使用继承自 TargetedTriggerAction 的类允许通过属性更改和控件来控制 Storyboard:

public class ImageAnimationTrigger : TargetedTriggerAction<Storyboard>
{
protected override void Invoke(object parameter)
{
if (Target == null)
return;

if (parameter is DependencyPropertyChangedEventArgs)
{
DependencyPropertyChangedEventArgs args = (DependencyPropertyChangedEventArgs)parameter;

if ((bool)args.NewValue)
Target.Begin();
else
Target.Stop();
}
else if (parameter is RoutedEventArgs)
{
RoutedEventArgs args = (RoutedEventArgs)parameter;

if (!(args.OriginalSource as Button).IsEnabled)
Target.Begin();
else
Target.Stop();
}
}
}

我将此行为与 PropertyChangedTrigger 一起使用,如下所示:

<i:Interaction.Triggers>
<ic:PropertyChangedTrigger Binding="{Binding Loading}">
<behav:ImageAnimationTrigger TargetName="animStoryboard" />
</ic:PropertyChangedTrigger>
</i:Interaction.Triggers>

正如 Laurent Bugnion 所说,如果需要,请使用代码隐藏!

关于windows-phone-7 - MVVM 如何摆脱代码隐藏事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14942741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com