我有一个简单的视图,显示一个标签,其中包含一个从我的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;
}
答案 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有关更改。