微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xamarin MVVM:通过在 ViewModel 中完成的一些计算结果更新控件样式字体大小、边框颜色等

如何解决Xamarin MVVM:通过在 ViewModel 中完成的一些计算结果更新控件样式字体大小、边框颜色等

我正在迈出学习 Xamarin Forms 的第一步,但遇到了无法找到简单解决方案的设计问题。我想利用 MVVM 方法并在考虑最佳实践的情况下实施它,尽管我意识到同样的事情可以用不同的方式来完成。

所以我在视图中有按钮和标签控件。单击按钮将命令发送到 viewmodel,该 viewmodel 运行一些计算(或将它们委托给模型)并影响文本字段中标签的文本和视觉表示。 viewmodel 有 Text 属性显示在文本框中,这可以通过属性绑定轻松完成

<Label Text="Binding Text" ...></Label> 

所以一旦 viewmodel 修改了它在更新的 View 上显示的文本,这不是问题。有问题的设计是第二部分:我不确定如何在 viewmodel 中完成计算后立即更新标签的视觉样式,例如边框颜色和字体的删除线样式,我认为只有代码隐藏(xaml.cs)可以适当做,没有约束力。

其中一种方法是将其保留为命令 xaml -> VM -> M

<Button ButtonClickedCommand="{Binding RuncalculationsCommand}" ...>

并让 VM 在 viewmodel 中引发某个特定事件,代码隐藏会捕获该事件并执行“样式化”工作:VM -> xaml.cs

一个是在视图上引发一个常规事件(不是命令),在 viewmodel 中开始计算并运行样式 xaml -> xaml.cs -> VM -> M

<Button Clicked="Runcalculations_OnClicked" ...>

但是根据我的理解,它的耦合更紧密,并没有完全遵循 MVVM。

或者我想最好的可能是我还不知道的其他东西

解决方法

两种选择:绑定一个trigger,或者直接将控件属性绑定到VM。
然后,在按钮命令中更新 VM 属性。

  1. 使用预设样式绑定触发器。
<Label Text="{Binding Text}" TextColor="Green">
    <Label.Triggers>
        <DataTrigger
            Binding="{Binding CalculationResultIsNegative}"
            TargetType="Label"
            Value="true">

            <!-- set Specific Property -->
            <Setter Property="TextColor" Value="Red" />

            <!-- or set Specific Style in App.xaml -->
            <Setter Property="Style" Value="{StaticResource RedStyleDefinedInAppXaml}" />

        </DataTrigger>
    </Label.Triggers>
</Label>

在您的虚拟机中更新

void RunCalculationsCommandMethod ()
{
    //if...
    CalculationResultIsNegative = true;
    //else..
    //CalculationResultIsNegative = false;
}
  1. 在 XAML 中绑定控件属性
<Label Text="{Binding Text}"
       TextColor="{Binding ColorPropertyFromVM"}
       FontAttributes="{Binding FontAttributesProperty"} />

在您的虚拟机中更新

void RunCalculationsCommandMethod ()
{
    //if...
    ColorPropertyFromVM = Color.Red;
    FontAttributesProperty = FontAttributes.Bold;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。