ViewModel和View之间的Mvvm交叉绑定;不适用于按钮

本文关键字:绑定 不适用 适用于 按钮 View 之间 Mvvm ViewModel | 更新日期: 2023-09-27 17:58:43

我正在使用Xamarin使用MvvmCross在C#中开发一个适用于Android的应用程序。

当我使用我的一个视图模型时,该应用程序编译和运行良好,该视图模型绑定到一个搜索栏,但不与我想用按钮绑定的视图模型绑定。我所有的View模型都有一个非常相似的结构(除了名称之外,几乎完全相同)。

我的设置示例如下:

我的视图模型看起来像:

 public interface ISomething
    {
       int MethodSomething(int i);
    }
   public class ChangeSomethingViewModel : MvxViewModel
    {
        private readonly ISomething _somethign;
    public ChangeSomethingViewModel(ISomething something)
    {
        _something = something;
    }
    public override void Start()
    {
        Terminate_Something = "hello";
        base.Start();
    }
.
.
.
        public string terminate;
        public string Terminate_Something
        {
            get { return terminate; }
            set { terminate= "pressed"; RaisePropertyChanged(() => Terminate_Something); }
        }

然后我有另一个文件与MethodSomething(int I)

public class ChangeSomething : ISystem
    {
    public int MethodSomething(int i)
    {
        .
        .
        .
    }
     }

在setup.cs 中

        protected override IMvxApplication CreateApp()
        {
            Mvx.RegisterSingleton<IMvxAppStart>(new MvxAppStart<ChangeSomethingViewModel>());
            return new App();
        }
protected override void InitializeFirstChance()
        {
            Mvx.RegisterSingleton<ISomething>(new ChangeSomething());
            base.InitializeFirstChance();
        }

在我的Main.axml文件中,我有一个按钮

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
local:MvxBind="Click Terminate_Something" />

当我运行应用程序Terminate_Something时,正如我所期望的那样,它被设置并显示在按钮中。但是,如果我在Terminate_Something中放置断点并单击按钮,则不会调用Terminate_Something。

我可能应该提到,每次我按下按钮时,我都可以在日志中看到以下内容。

04-17 12:57:14.070 D/GestureDetector( 5928): [Surface Touch Event] mSweepDown False, mLRSDCnt : -1 mTouchCnt : 7 mFalseSizeCnt:0

我不太明白问题出在哪里,因为我的另一个视图模型可以很好地链接到滑块。当我按下滑块(参见栏)移动并调用Set时,相应的日志为

04-17 12:57:45.060 D/ProgressBar( 5928): setProgress = 43, fromUser = true
04-17 12:57:45.060 D/ProgressBar( 5928): mProgress = 50mIndeterminate = false, mMin = 0, mMax = 70

提前感谢

ViewModel和View之间的Mvvm交叉绑定;不适用于按钮

问题似乎是因为您没有绑定到ICommand。此外,我可能在某个地方遗漏了它,但您也应该在Terminate_Something MethodSomethings中指定,不是吗?

这应该可以修复它:在视图模型中,将Terminate_Something属性更改为

 private MvxCommand terminate;
   public System.Windows.Input.ICommand Terminate_Something
   {
       get
       {
           terminate = terminate ?? new MvxCommand(MethodSomething);
           return terminate;
       }
   }

既然你提到SeekBar正在工作,你不是做了一些类似的事情吗?

set { terminate= "pressed"; RaisePropertyChanged(() => Terminate_Something); MethodSomething();}

无论如何,Stuart在N=5 中有一个关于这件事的视频

编辑:

显然,您不能将terminate设置为";你好";在start()中。。。根据你试图用按钮做什么,你可以绑定文本";你好";的属性转换为其他属性。