是否可以使用 MVVM 从视图修改视图模型中的属性? [复制]

Posted

技术标签:

【中文标题】是否可以使用 MVVM 从视图修改视图模型中的属性? [复制]【英文标题】:Is it possible to modify a property in the view model from the view using MVVM? [duplicate] 【发布时间】: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 触发命令,但我不知道可以从代码隐藏触发命令 ***.com/questions/10126968/… 【参考方案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,我已经有几天没有收到你的消息了。如果有什么我可以在这里提供帮助的,请告诉我。

以上是关于是否可以使用 MVVM 从视图修改视图模型中的属性? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何从 mvvm 中的视图模型关闭视图?

当我尝试使用 MVVM WPF 中的命令修改对象时,为啥在视图模型中出现空错误?

iOS:如何使用 MVVM 将模型从视图模型传递到视图模型?

WPF(MVVM):从 Viewmodel 关闭视图?

如何从作为wpf mvvm模式中的窗口打开的视图模型中关闭用户控件?

将 [VisualStateManager] 视图状态绑定到 MVVM 视图模型?