Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/122.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用MvvmLight和Xamarin.iOS将属性绑定到ViewModel_C#_Ios_Mvvm_Xamarin_Mvvm Light - Fatal编程技术网

C# 使用MvvmLight和Xamarin.iOS将属性绑定到ViewModel

C# 使用MvvmLight和Xamarin.iOS将属性绑定到ViewModel,c#,ios,mvvm,xamarin,mvvm-light,C#,Ios,Mvvm,Xamarin,Mvvm Light,我已经使用MvvmLight很长时间了,它非常适合我在Windows和Windows Phone开发中的需要,但是我很难适应版本5中引入的新的Xamarin.iOS绑定功能 我已经检查了Flowers示例,并尝试创建一个真正简单的绑定,但它不能像预期的那样工作:更新操作只执行一次 下面是视图控制器的代码: public partial class MainViewController : UIViewController { private MainViewModel ViewMode

我已经使用MvvmLight很长时间了,它非常适合我在Windows和Windows Phone开发中的需要,但是我很难适应版本5中引入的新的Xamarin.iOS绑定功能

我已经检查了
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);

    }
}
生成的具有两个接口元素的分部类声明:

[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; }
}
public类MainViewModel:ViewModelBase
{
公共主视图模型()
{
this.UpdateCommand=新的RelayCommand(()=>
{
this.IsUpdated=!this.IsUpdated;
});
}
私人楼宇更新;
公共图书馆更新
{
获取{返回this.isUpdated;}
设置
{
此.Set(参考this.isUpdated,值);
}
}
public RelayCommand UpdateCommand{get;private set;}
}

任何人都有一个工作示例和一些解释?

您必须将在SetBinding中创建的绑定存储在ViewController中,否则一旦离开ViewDiLoad的范围,它就会消失。在Flowers示例中,该代码仅在加载视图期间运行。由于值的更改,它永远不会运行

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);

    }
}
公共部分类MainViewController:UIViewController
{
私有绑定_isUpdatedBinding;
私有MainViewModel视图模型{get;set;}
公共主视图控制器()
:base(“MainViewController”,null)
{
this.ViewModel=newmainviewmodel();
}
公共覆盖无效ViewDidLoad()
{
base.ViewDidLoad();
_isUpdatedBinding=this.SetBinding(()=>this.ViewModel.isUpdate)。当资源更改(()=>
{
this.updateLabel.Text=this.ViewModel.IsUpdated?“没关系!”:“不……”;
});
this.updateButton.SetCommand(“TouchUpInside”,this.ViewModel.UpdateCommand);
}
}
我相信这些改变会解决你的问题