博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第十八章:MVVM(八)
阅读量:6344 次
发布时间:2019-06-22

本文共 3016 字,大约阅读时间需要 10 分钟。

简单的方法执行

让我们看一个简单的例子。一个名为PowersOfThree的程序允许您使用两个按钮来探索3的各种幂。一个按钮增加指数,另一个按钮减少指数。
PowersViewModel类派生自Xamarin.FormsBook.Toolkit库中的ViewModelBase类,但ViewModel本身位于PowersOfThree应用程序项目中。它不限于3的幂,但构造函数需要一个参数,该类用作功率计算的基值,并作为BaseValue属性公开。因为此属性具有私有集访问器,并且在构造函数结束后不会更改,所以该属性不会触发PropertyChanged事件。
另外两个名为Exponent和Power的属性会触发PropertyChanged事件,但这两个属性也有私有集访问器。 Exponent属性仅从外部按钮单击增加和减少。
为了实现对Button抽头的响应,PowersViewModel类定义了两个类型为ICommand的属性,名为IncreaseExponentCommand和DecreaseExponentCommand。同样,这两个属性都有私有集访问器。如您所见,构造函数通过实例化紧跟构造函数后引用很少私有方法的Command对象来设置这两个属性。调用Command的Execute方法时会调用这两个小方法。 ViewModel使用Command类而不是Command ,因为程序没有使用Execute方法的任何参数:

class PowersViewModel : ViewModelBase{    double exponent, power;    public PowersViewModel(double baseValue)    {        // Initialize properties.        BaseValue = baseValue;        Exponent = 0;        // Initialize ICommand properties.        IncreaseExponentCommand = new Command(ExecuteIncreaseExponent);        DecreaseExponentCommand = new Command(ExecuteDecreaseExponent);    }    void ExecuteIncreaseExponent()    {        Exponent += 1;    }    void ExecuteDecreaseExponent()    {        Exponent -= 1;    }    public double BaseValue { private set; get; }    public double Exponent    {        private set        {            if (SetProperty(ref exponent, value))            {                Power = Math.Pow(BaseValue, exponent);            }        }        get        {            return exponent;        }    }    public double Power    {        private set { SetProperty(ref power, value); }        get { return power; }    }    public ICommand IncreaseExponentCommand { private set; get; }    public ICommand DecreaseExponentCommand { private set; get; }}

ExecuteIncreaseExponent和ExecuteDecreaseExponent方法都会更改Exponent属性(触发PropertyChanged事件),Exponent属性重新计算Power属性,该属性也会触发PropertyChanged事件。

通常,ViewModel将通过将lambda函数传递给Command构造函数来实例化其Command对象。 这种方法允许在ViewModel构造函数中定义这些方法,如下所示:

IncreaseExponentCommand = new Command(() =>    {        Exponent += 1;    });DecreaseExponentCommand = new Command(() =>    {        Exponent -= 1;    });

PowersOfThreePage XAML文件将三个Label元素的Text属性绑定到PowersViewModel类的BaseValue,Exponent和Power属性,并将两个Button元素的Command属性绑定到ViewModel的IncreaseExponentCommand和DecreaseExponentCommand属性。

注意如何将参数3传递给PowersViewModel的构造函数,因为它在Resources字典中实例化。 将参数传递给ViewModel构造函数是存在x:Arguments标记的主要原因:

3

这是几次按下一个按钮或另一个按钮后的样子:

2018_10_15_141339
再一次,当需要更改视图时,就会发现将用户界面与底层业务逻辑分离的智慧。 例如,假设您要使用带有TapGestureRecognizer的元素替换按钮。 幸运的是,TapGestureRecognizer有一个Command属性:

在没有触摸ViewModel或甚至重命名事件处理程序以使其应用于点击而不是按钮的情况下,程序的工作方式相同,但外观不同:

2018_10_15_141655

转载地址:http://ujjla.baihongyu.com/

你可能感兴趣的文章
Raspberry Pi开发之旅-WIFI遥控小车
查看>>
设计模式总结之结构型模式
查看>>
mysql -- 优化之ICP(index condition pushdown)
查看>>
Linux 下查看某个进程运行的堆栈信息
查看>>
链路层的双链路--大型服务器的优化体系
查看>>
【转】代码生成器集合
查看>>
MyBatis+PageHelper实现分页
查看>>
POJ 3070 Fibonacci
查看>>
HDU 2514 Another Eight Puzzle
查看>>
python中集合及运算
查看>>
python中的面向对象学习以及类的多态
查看>>
一些有用的链接
查看>>
json数据进行格式化
查看>>
react.js 测试
查看>>
快速排序
查看>>
【转】 vim显示行号、语法高亮、自动缩进的设置
查看>>
HDU 5533 Dancing Stars on Me 计算几何瞎暴力
查看>>
PIC18F452之1602自定义字符
查看>>
Vue-axios 在vue cli中封装
查看>>
jquery实现 批量右移
查看>>