首页 > 解决方案 > 在另一个类中更改 ViewModel 属性不会更新 UI

问题描述

我在一个更复杂的应用程序中遇到了这个问题,所以我构建了一个简单的应用程序来测试它。但首先是代码,这是一个简单应用程序的奇怪布局,但请记住,这模仿了我的其他应用程序。

注意,Baseviewmodel 继承自 basemodel。

主页

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage x:Class="TestINotify.MainPage"
             xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:TestINotify">
  <ContentPage.BindingContext>
    <local:MainPageViewModel />
  </ContentPage.BindingContext>

  <StackLayout>
    <!--  Place new controls here  -->
    <Label HorizontalOptions="Center"
           Text="Welcome to Xamarin.Forms!"
           VerticalOptions="CenterAndExpand" />
    <Label HorizontalOptions="Center"
           Text="{Binding LabelTextProperty}"
           VerticalOptions="CenterAndExpand" />
    <Button Command="{Binding ChangeTextCommand}" Text="Change Label Text" />

  </StackLayout>

</ContentPage>

MainPageViewModel

public class MainPageViewModel : BaseViewModel
{
    public ICommand ChangeTextCommand { private set; get; }

    private string _labelText = "Default text" ;

    public string LabelTextProperty
    {
        get
        {
            return _labelText;

        }
        set
        {
            _labelText = value;
            OnPropertyChanged();
        }
    }

    public MainPageViewModel()
    {
        ChangeTextCommand = new Command(execute: () =>
        {
            var handler = new ChangeTextClass();
            handler.ChangeTexts();

        });

    }

}

更改文本类

    public class ChangeTextClass
    {
        public MainPageViewModel mpvm = new MainPageViewModel();
        public void ChangeTexts()
        {
            mpvm.LabelTextProperty = "The Text Was Changed ?";

        }
    }

基本模型

public abstract class BaseModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

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

当我在视图模型中分配标签的文本值时

    ChangeTextCommand = new Command(execute: () =>
    {
       LabelTextProperty = "Local works";

    });

它工作正常,但是,所以也许这与我在类中创建视图模型的新实例有关?

标签: c#xamarinmvvmxamarin.forms

解决方案


推荐阅读