【问题标题】:Is it possible to modify a property in the view model from the view using MVVM? [duplicate]是否可以使用 MVVM 从视图修改视图模型中的属性? [复制]
【发布时间】:2021-12-20 12:37:21
【问题描述】:

在避开 MVVM 数周后,我终于决定再试一次。在我看来,我想要实现的目标相对简单。我想缩小一个框架,更新框架内的文本,然后再次将框架放大到正常大小

在我的代码隐藏中,我有一个方法可以在点击框架时将框架缩放到 0.1。我在后面的代码中将此作为手势识别器,因为我的理解是动画必须在视图中。

在我的 ViewModel 中,我有一个名为 FrameText 的属性。这是我要更新的值。我想在扩展之前更新属性。所以这就是我想出的。

>await TestFrame.ScaleTo(0.1, 60, Easing.Linear);  
>ViewModels.MainViewModel.FrameText = "new text";  
>await TestFrame.ScaleTo(1, 60, Easing.Linear);

我很快意识到这是有缺陷的,但在花了几个小时试图了解 MVVM 的工作原理后,我认为最好还是问一下。我不应该在这里使用 MVVM 吗?我是否误解了 MVVM 的工作原理?提前谢谢你。

【问题讨论】:

  • “缩小框架,更新框架内的文本,然后放大框架”——这听起来像是与底层数据无关的 UI 操作。
  • @Jason 感谢您的评论,但我想我误解了一些东西。我在后面的代码中有缩小框架和放大框架的操作,因为它们是 UI 操作。我想更新两个动画之间的文本,但属性在我的 ViewModel 中。我将如何从视图中修改 ViewModel 中的属性,以便它发生在两个动画之间?我是在错误地处理整个事情,还是应该干脆不使用 MVVM 和不同的方式来绑定数据?我是使用 MVVM 的新手,因此我们将不胜感激。
  • 为什么不在虚拟机中公开一个在动画完成时触发的命令,并且会更新文本?
  • 我该怎么做?我有一个可以更新文本的命令,但我不知道在动画完成后如何触发它。我知道如何从 XAML 触发命令,但我不知道可以从代码隐藏触发命令

标签: c# xamarin .net-core xamarin.forms


【解决方案1】:

我看不到其他代码,但一般来说,如果我们想在更改绑定到视图的属性的值后更新 UI,我们可以让我们的 ViewModel 实现接口INotifyPropertyChanged。实现此接口的类通常会在其公共属性之一更改值时触发事件。

请参考以下代码:

public class MainViewModel: INotifyPropertyChanged
{
    string _frameText;

    public string FrameText
    {
        set { SetProperty(ref _frameText, value); }

        get { return _frameText; }
    }

    bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
    {
        if (Object.Equals(storage, value))
            return false;

        storage = value;
        OnPropertyChanged(propertyName);
        return true;
    }

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

更多信息,请查看:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/data-binding/binding-mode#viewmodels-and-property-change-notifications

【讨论】:

  • 嗨@foxre,我已经有几天没有收到你的消息了。如果有什么我可以在这里提供帮助的,请告诉我。
猜你喜欢
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 2020-02-08
  • 2017-10-11
  • 2011-10-22
  • 2017-10-24
  • 1970-01-01
  • 2013-03-10
相关资源
最近更新 更多