使用 MvvmLight 和 Xamarin.iOS 将 属性 绑定到 ViewModel
Binding a property to a ViewModel with MvvmLight and Xamarin.iOS
我已经使用 MvvmLight 很长时间了,它完全符合我对 Windows 和 Windows Phone 开发的需求,但我对新的 Xamarin.iOS 版本 5 中引入的绑定功能。
我检查了 Flowers
示例,并尝试创建一个非常简单的绑定,但它没有按预期工作:更新操作只执行一次 ...
这里是视图控制器的代码:
public partial class MainViewController : UIViewController
{
private MainViewModel ViewModel { get; set; }
public MainViewController()
: base("MainViewController", null)
{
this.ViewModel = new MainViewModel();
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
this.SetBinding(() => this.ViewModel.IsUpdated).WhenSourceChanges(() =>
{
this.updateLabel.Text = this.ViewModel.IsUpdated ? "It's okay !" : "Nope ...";
});
this.updateButton.SetCommand("TouchUpInside", this.ViewModel.UpdateCommand);
}
}
生成的带有两个接口元素的部分class声明:
[Register ("MainViewController")]
partial class MainViewController
{
[Outlet]
MonoTouch.UIKit.UIButton updateButton { get; set; }
[Outlet]
MonoTouch.UIKit.UILabel updateLabel { get; set; }
void ReleaseDesignerOutlets ()
{
if (updateLabel != null) {
updateLabel.Dispose ();
updateLabel = null;
}
if (updateButton != null) {
updateButton.Dispose ();
updateButton = null;
}
}
}
以及关联的 ViewModel :
public class MainViewModel : ViewModelBase
{
public MainViewModel()
{
this.UpdateCommand = new RelayCommand(() =>
{
this.IsUpdated = !this.IsUpdated;
});
}
private bool isUpdated;
public bool IsUpdated
{
get { return this.isUpdated; }
set
{
this.Set<bool>(ref this.isUpdated, value);
}
}
public RelayCommand UpdateCommand { get; private set; }
}
有人有工作示例和一些解释吗?
您必须将在 SetBinding 中创建的绑定存储在 ViewController 中,否则一旦您离开 ViewDidLoad 的范围,它就会消失。在 Flowers 示例中,该代码在加载视图期间仅 运行s。永远不会 运行 由于值的变化。
public partial class MainViewController : UIViewController
{
private Binding<bool, bool> _isUpdatedBinding;
private MainViewModel ViewModel { get; set; }
public MainViewController()
: base("MainViewController", null)
{
this.ViewModel = new MainViewModel();
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
_isUpdatedBinding = this.SetBinding(() => this.ViewModel.IsUpdated).WhenSourceChanges(() =>
{
this.updateLabel.Text = this.ViewModel.IsUpdated ? "It's okay !" : "Nope ...";
});
this.updateButton.SetCommand("TouchUpInside", this.ViewModel.UpdateCommand);
}
}
我相信这些更改应该可以解决您的问题。
我已经使用 MvvmLight 很长时间了,它完全符合我对 Windows 和 Windows Phone 开发的需求,但我对新的 Xamarin.iOS 版本 5 中引入的绑定功能。
我检查了 Flowers
示例,并尝试创建一个非常简单的绑定,但它没有按预期工作:更新操作只执行一次 ...
这里是视图控制器的代码:
public partial class MainViewController : UIViewController
{
private MainViewModel ViewModel { get; set; }
public MainViewController()
: base("MainViewController", null)
{
this.ViewModel = new MainViewModel();
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
this.SetBinding(() => this.ViewModel.IsUpdated).WhenSourceChanges(() =>
{
this.updateLabel.Text = this.ViewModel.IsUpdated ? "It's okay !" : "Nope ...";
});
this.updateButton.SetCommand("TouchUpInside", this.ViewModel.UpdateCommand);
}
}
生成的带有两个接口元素的部分class声明:
[Register ("MainViewController")]
partial class MainViewController
{
[Outlet]
MonoTouch.UIKit.UIButton updateButton { get; set; }
[Outlet]
MonoTouch.UIKit.UILabel updateLabel { get; set; }
void ReleaseDesignerOutlets ()
{
if (updateLabel != null) {
updateLabel.Dispose ();
updateLabel = null;
}
if (updateButton != null) {
updateButton.Dispose ();
updateButton = null;
}
}
}
以及关联的 ViewModel :
public class MainViewModel : ViewModelBase
{
public MainViewModel()
{
this.UpdateCommand = new RelayCommand(() =>
{
this.IsUpdated = !this.IsUpdated;
});
}
private bool isUpdated;
public bool IsUpdated
{
get { return this.isUpdated; }
set
{
this.Set<bool>(ref this.isUpdated, value);
}
}
public RelayCommand UpdateCommand { get; private set; }
}
有人有工作示例和一些解释吗?
您必须将在 SetBinding 中创建的绑定存储在 ViewController 中,否则一旦您离开 ViewDidLoad 的范围,它就会消失。在 Flowers 示例中,该代码在加载视图期间仅 运行s。永远不会 运行 由于值的变化。
public partial class MainViewController : UIViewController
{
private Binding<bool, bool> _isUpdatedBinding;
private MainViewModel ViewModel { get; set; }
public MainViewController()
: base("MainViewController", null)
{
this.ViewModel = new MainViewModel();
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
_isUpdatedBinding = this.SetBinding(() => this.ViewModel.IsUpdated).WhenSourceChanges(() =>
{
this.updateLabel.Text = this.ViewModel.IsUpdated ? "It's okay !" : "Nope ...";
});
this.updateButton.SetCommand("TouchUpInside", this.ViewModel.UpdateCommand);
}
}
我相信这些更改应该可以解决您的问题。