【问题标题】:Change buttons BackgroundColor using MVVM使用 MVVM 更改按钮 BackgroundColor
【发布时间】:2018-09-18 12:58:31
【问题描述】:

我有两个按钮,当我单击一个按钮时,我想使用 mvvm 更改另一个按钮 BackgroundColor 我正在努力做到这一点

<StackLayout>
    <Button Text="Red" BackgroundColor="Accent" Command="{Binding ChangeButtons}" x:Name="btnRed"></Button>
    <Button Text="Blue" x:Name="btnBlue"></Button>
</StackLayout>

当我点击btnRed 时,我希望更改btnBlue BackgroundColor。 模型视图页面

public class ButtonColorViewModel
{
    public Command ChangeButtons
    {
        get
        {
            return new Command(() => {

               //Change here button background colors

            });
        }
    }
}

我该如何实现它?

【问题讨论】:

  • 符合 MVVM,您将需要一个(如果您希望它们不同,则需要两个)代表背景颜色
  • 我有 3 个按钮和 1 个 xaml 文件。点击 1 btn(或相反),我需要更改另一个 2 btns bg 颜色。

标签: c# xamarin mvvm xamarin.forms


【解决方案1】:

基本上就像这样,您需要一个颜色属性来绑定。您可以在命令中更改属性的值。您可以调整它以满足您的需要,2,3,颜色/按钮等:

public class ButtonColorViewModel
{
    public Command ChangeButtons
    {
        get
        {
            return new Command(() => {

               //Change here button background colors
               BackgroundColorBtn1 = Color.Green; //or something
            });
        }
    }


    private _backgroundColorBtn1 = Color.White;
    public Color BackgroundColorBtn1
    {
        get { return _backgroundColorBtn1;}
        set
        {
             if (value == _backgroundColorBtn1)
                 return;

             _backgroundColorBtn1 = value;
             NotifyOnPropertyChanged(nameof(BackgroundColorBtn1));
         }
    }
}

使用 XAML:

<StackLayout>
    <Button Text="Red" BackgroundColor="Accent" Command="{Binding ChangeButtons}" 
            x:Name="btnRed"></Button>
    <Button BackgroundColor="{Binding BackgroundColorBtn1}" Text="Blue" 
            x:Name="btnBlue"></Button>
</StackLayout>

【讨论】:

  • 你让我...比光还快:P
  • 谢谢,不过,如果您愿意,请随时添加信息。
  • 我只想说你可以删除x:Name,因为它们会保留内存位置,但你的答案是完美的
  • 嗯,我只记得:这样做会在您每次按下按钮时调用new Command....
  • 也许在构造函数/初始化程序中创建它会更好,这样实例将永远相同,并且每次单击按钮时都不会创建它
【解决方案2】:

根据您对 MVVM 的想法,最佳选择是(尽可能)避免在 ViewModel 中使用 UI。 在上一个答案中,使用了颜色对象。 如果你想在这种情况下保留 MVVM:

  • 使用 OnPropertyChanged 创建一个属性,就像一个枚举一样
  • 将其绑定到背景色按钮

  • 使用转换器将您的属性转换为背景颜色:)

我知道这是更多的东西,但它更像 MVVM。

另外,如果您只停留在 UI 中,请转到后面的代码。 使用点击直接管理背景颜色。

【讨论】:

  • 转换器似乎很难使用,因为我是初学者形式。你说的方式有什么好处吗?
  • 转换器没什么大不了的,你会看到,它在 WPF 中真的很有用 :) 但是暂时,继续逐步探索 WPF。
  • 除了转换器之外,我是否还需要使用触发器来反映更改,因为我看到一些 wpf 问题类似于我在 stackoverflow 上使用触发器的问题,我不确定这些东西是否支持 xamarin。表格也是如此
  • 取决于您的目标。触发器最有可能用于根据控件的状态更改部分控件。例如,如果选中了一个复选框,我将更改我的复选框的边框、内容和字体颜色。
  • @MatDev8-感谢您的澄清。我开始知道这些东西也可以在 xamarin.forms 中使用。
猜你喜欢
  • 2021-03-25
  • 2013-10-10
  • 2011-07-19
  • 2019-12-13
  • 2021-12-01
  • 2018-05-07
  • 2018-01-15
  • 2018-12-05
  • 1970-01-01
相关资源
最近更新 更多