2017-01-19 5 views
1

У меня есть простой вид, который отображает метку с вопросом, который связан с моей ViewModel. теперь, если я устанавливаю свойство в своем конструкторе, я вижу, что Label отображает все, на что я его установил. если я заполнил свою командную функцию, я не вижу изменения метки. Самое забавное, что если я установил свойство Title (простая строка, которая имеет get и set), то это изменится независимо от того, где я его установил. но по какой-то причине это конкретное свойство не хочет показывать изменения в нем. Я попытался упростить это, насколько могу. Я попытался определить свойство публичной строки в моей ViewModel и снова, если я установил его в конструкторе, чем он связывает другие мудрые, если он задан в моей Командной функции, тогда он не изменяется.Xamarin View not Binding from viewModel after Constructor

вот мой 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

Я не вижу, где вы обжиг событие INofityPropertyChanged для вашего свойства MyClassObj.

Вместо того, чтобы просто:

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 об изменениях.

Смежные вопросы