Xamarin视图不在构造函数之后从viewModel绑定

时间:2017-01-19 04:58:39

标签: mvvm xamarin

我有一个简单的视图,显示一个标签,其中包含一个从我的ViewModel绑定的问题。现在,如果我在构造函数中设置属性,我会看到Label显示我设置的内容。如果我从我的命令功能填充,我没有看到标签已更改。有趣的是,如果我设置Title属性(一个带有get和set的简单字符串),那么无论我在哪里设置它都会发生变化。但由于某种原因,这个特殊的属性不想显示它的变化。我尽可能地尝试简化这个。我试图在我的ViewModel中定义一个公共字符串属性,如果我在构造函数中设置它,那么如果在我的命令函数中设置它,那么它将不会另外绑定,那么它不会改变。

这是我的XAML

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="Pre.MyPage"
         Title="{Binding Title}"
         Icon="about.png">
 <StackLayout  VerticalOptions="Center" HorizontalOptions="Center" >
   <Label Text="{Binding MyClassObj.Question, Mode=TwoWay}"/>  
 </StackLayout>
 </ContentPage>

这是我背后的代码

public partial class MyPage : ContentPage
{
    MyViewModel vm;
    MyViewModel ViewModel => vm ?? (vm = BindingContext as MyViewModel);
    public MyPage()
    {
        InitializeComponent();
        BindingContext = new MyViewModel(Navigation);
    }
    protected override void OnAppearing()
    {
        base.OnAppearing();
        ViewModel.LoadQuestionCommand.Execute("1");
    }
}

这是我的ViewModel

public class MyViewModel : ViewModelBase 
{
    public MyClass MyClassObj {get;set;}

    ICommand loadQuestionCommand;
    public ICommand LoadQuestionCommand =>
        loadQuestionCommand ?? (loadQuestionCommand = new Command<string>(async (f) => await LoadQuestion(f)));

    public MyViewModel(INavigation navigation) : base(navigation)
    {
        Title = "My Title";            
    }
    async Task<bool> LoadQuestion(string id)
    {
        if (IsBusy)
            return false;
        try
        {
            IsBusy = true;

            MyClassObj = await StoreManager.QuestionStore.GetQuestionById(id);   
            //MyClassObject is populated when I break here
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
        finally
        {
            IsBusy = false;
        }
        return true;
    }

1 个答案:

答案 0 :(得分:1)

我不知道你在哪里为你的MyClassObj属性解雇了INofityPropertyChanged事件。

而不仅仅是:

public MyClass MyClassObj {get;set;}

你应该有类似的东西:

MyClass myClassObj;
public MyClass MyClassObj 
{
    get {return myClassObj;}
    set
    {
        //if they are the same you should not fire the event.
        //but since it's a custom object you will need to override the Equals
        // of course you could remove this validation.
        if(myClassObj.Equals(value))
            return;

        myClassObj = value;

        //This method or something has to be in your VieModelBase,  similar.
        NotifyPropertyChanged(nameof(MyClassObj));
   }
 }    

最后一个方法

NotifyPropertyChanged(nameof(MyClassObj));

是谁通知View有关更改。