单击时,我需要一个按钮在视图中移动。 我已按以下方式绑定按钮(Android)
set.Bind(_paramsButton).For(pb => pb.LeftMargin).To(vm => vm.ButtonX).OneWay();
set.Bind(_paramsButton).For(pb => pb.TopMargin).To(vm => vm.ButtonY).OneWay();
set.Bind(_paramsButton).For(pb => pb.Height).To(vm => vm.ButtonHight).OneWay();
set.Bind(_paramsButton).For(pb => pb.Width).To(vm => vm.ButtonWidth).OneWay();
在viewModel中我有'普通'属性
private int _buttonX;
public int ButtonX
{
get { return _buttonX; }
set { _buttonX = value; RaisePropertyChanged(() => ButtonX); }
}
等
这很好用。 现在我有10个按钮,想要绑定像
for(int i=0; i<10; i++){
set.Bind(_paramsButton[i]).For(pb => pb.LeftMargin).To(vm => vm.ButtonX[i]).OneWay();
set.Bind(_paramsButton[i]).For(pb => pb.TopMargin).To(vm => vm.ButtonY[i]).OneWay();
set.Bind(_paramsButton[i]).For(pb => pb.Height).To(vm => vm.ButtonHight[i]).OneWay();
set.Bind(_paramsButton[i]).For(pb => pb.Width).To(vm => vm.ButtonWidth[i]).OneWay();
}
或
for(int i=0; i<10; i++){
set.Bind(_paramsButton[i]).For(pb => pb.LeftMargin).To(vm => vm.Button[i].X).OneWay();
set.Bind(_paramsButton[i]).For(pb => pb.TopMargin).To(vm => vm.Button[i].Y).OneWay();
set.Bind(_paramsButton[i]).For(pb => pb.Height).To(vm => vm.Button[i].Height).OneWay();
set.Bind(_paramsButton[i]).For(pb => pb.Width).To(vm => vm.Button[i].Width).OneWay();
}
我的问题是在viewModel中,我不知道如何让RaisePropertyChanged触发数组列表中的各个项目。 有没有人有关于如何在modelView中声明整数数组的例子?
答案 0 :(得分:1)
一般的答案是,如果您要为子视图模型触发RaisePropertyChanged
,那么最简单的方法是使该子视图模型支持INotifyPropertyChanged
因此,例如,您可以拥有一个ButtonViewModel子类,如:
public class ButtonViewModel : MvxNotifyPropertyChanged
{
private int _x;
public int X
{
get { return _x; }
set { _x = value; RaisePropertyChanged(() => X); }
}
// etc
}
然后您的网页级ViewModel可以存储List
或ObservableCollection
个:
public class MyViewModel : MvxViewModel
{
private readonly List<ButtonViewModel> _buttons;
public List<ButtonViewModel> Buttons
{
get { return __buttons; }
}
// etc
}
一般来说,这是解决问题的方法 - 这应该允许绑定工作。
但是......对于您的特定代码,还有另一个需要考虑的问题。
您的绑定语句在绑定表达式中包含一个for循环变量:
for(int i=0; i<10; i++){
set.Bind(_paramsButton[i]).For(pb => pb.LeftMargin).To(vm => vm.Button[i].X).OneWay();
}
我担心这只是无效 - MvvmCross的表达式walk对这些类型的局部变量表达式没有任何内置评估。
您可以为绑定语句生成一个字符串,如:
for(int i=0; i<10; i++){
var to = string.Format("Button[{0}].X", i);
set.Bind(_paramsButton[i]).For(pb => pb.LeftMargin).To(to).OneWay();
}
作为其他一些选择:
MvxView
个对象 - 每个对象都有自己的内部绑定。有关此想法的更多信息,请参阅http://slodge.blogspot.co.uk/2013/06/n32-truth-about-viewmodels-starring.html