J'ai un réel exemple simple qui fonctionne bien sans viewmodel que j'ai un élément classe qui implémente INotifyPropertyChanged:silverlight MVVM viewmodel pour voir la liaison ne fonctionne pas
public class Item : INotifyPropertyChanged
{
private string _name;
private string _desc;
public string Name
{
get
{ return _name; }
set
{
if (_name == value)
return;
_name = value;
this.OnPropertyChanged(new PropertyChangedEventArgs("Name"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public Item()
{
}
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, e);
}
}
Cela fonctionne dans un exemple simple où je le code suivant derrière:
public MainPage()
{
InitializeComponent();
item = new Item() { Name = "john", Description = "this is my name" };
LayoutRoot.DataContext = item;
}
et si j'ai un bouton qui appelle un gestionnaire de commandes dans le code derrière je vois des changements à l'interface utilisateur simple PropertyChanged événement est en train d'être "écouté" à la suite de la liaison Twoway sur ma propriété de texte. le gestionnaire ressemble:
private void Button_Click(object sender, RoutedEventArgs e)
{
item.Name = "ted";
item.Description = "adddress";
}
donc bien sûr cela change l'interface (je l'ai dit est réel exemple simple) Maintenant, je vous présente un viewmodel et les modifications apportées au modèle simple ne sont pas reflétés comme il n'y a pas un écouter pour la propriétéchangé.
Je mis la datacontext en vue de la viewmodel, enfait c'est la seule ligne de code dans la vue:
LayoutRoot.DataContext = new MyViewModel();
Maintenant, mon ViewModel ressemble:
public class MyViewModel
{
Item item = null;
public ICommand ChangeCommand { get; private set; }
public MyViewModel()
{
item = new Item() { Name = "john", Description = "jjjj" };
ChangeCommand = new DelegateCommand<string>(OnChange);
}
private void OnChange(string title)
{
item.Name = "bill";
}
Notes: J'utilise la commande Patterns and practices pour déclencher l'événement du XAML au Viewmodel et cela fonctionne très bien
Mon gestionnaire modifie à nouveau l'item.name qui entraîne l'appel de l'accesseur set et le this.OnPropertyChanged (new PropertyChangedEventArgs ("Name")); étant appelé, mais personne n'est écoute donc aucun changement n'est effectué. J'essaie de garder cet exemple très simple et certains diront trop simple mais je veux juste savoir pourquoi la liaison ne fonctionne pas. Je peux tirer de la vue à viewmodel mais j'ai besoin de pour pouvoir faire l'inverse. Je me demande quel point je manque.
Je pense que j'ai deviné votre problème correctement, mais la question serait plus claire si vous avez inclus en plus le code de liaison de données XAML. –