2010-12-10 21 views
0

Est-il possible de lier des données dans la «mauvaise» direction? Je veux qu'une valeur dans un contrôle personnalisé soit liée à mon ViewModel. J'ai essayé la liaison avec le mode "OneWayToSource" mais je n'arrive pas à le faire fonctionner.WPF MVVM Lier la liste sur le contrôle personnalisé à ViewModel

Scénario (simplifié):

J'ai un contrôle personnalisé (MyCustomControl) qui a une propriété de dépendance qui est une liste de chaînes:

public class MyCustomControl : Control 
{ 
    static MyCustomControl() 
    { 
     //Make sure the template in Themes/Generic.xaml is used. 
     DefaultStyleKeyProperty.OverrideMetadata(typeof (MyCustomControl), new FrameworkPropertyMetadata(typeof (MyCustomControl))); 

     //Create/Register the dependency properties. 
     CheckedItemsProperty = DependencyProperty.Register("MyStringList", typeof (List<string>), typeof (MyCustomControl), new FrameworkPropertyMetadata(new List<string>())); 
    } 

    public List<string> MyStringList 
    { 
     get 
     { 
      return (List<string>)GetValue(MyCustomControl.MyStringListProperty); 
     } 
     set 
     { 
      var oldValue = (List<string>)GetValue(MyCustomControl.MyStringListProperty); 
      var newValue = value; 
      SetValue(MyCustomControl.MyStringListProperty, newValue); 
      OnPropertyChanged(new DependencyPropertyChangedEventArgs(MyCustomControl.MyStringListProperty, oldValue, newValue)); 
     } 
    } 
    public static readonly DependencyProperty MyStringListProperty; 
} 

Le contrôle contient également le code pour manipuler cette liste. J'utilise ce contrôle personnalisé dans un contrôle UserControl qui a un ViewModel.

Le ViewModel a une propriété qui est aussi une liste de chaînes:

public List<string> MyStringsInTheViewModel 
{ 
    get 
    { 
     return _myStringsInTheViewModel; 
    } 
    set 
    { 
     if (value != _myStringsInTheViewModel) 
     { 
      _myStringsInTheViewModel = value; 
      OnPropertyChanged("MyStringsInTheViewModel"); 
     } 
    } 
} 
private List<string> _myStringsInTheViewModel; 

Maintenant, je veux lier la liste dans mon contrôle personnalisé (MyStringList) à la liste dans mon ViewModel (MyStringsInTheViewModel) de sorte que lorsque la liste est modifiée Dans le contrôle personnalisé, il est également modifié dans ViewModel. J'ai essayé cela, mais ne peux pas le faire fonctionner ...

<myns:MyCustomControl MyStringList="{Binding Path=MyStringsInTheViewModel, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"> 

Comment puis-je faire une telle fixation?

+0

Pourquoi utilisez-vous 'OneWayToSource'? Je suppose que supprimer les 'Mode' et' UpdateSourceTrigger' pourrait être suffisant pour que la liaison fonctionne. –

Répondre

2

Utilisez ObservableCollection<T> au lieu de List<T>. Il implémente l'interface INotifyCollectionChanged.

+0

Ah, c'était le problème. J'ai mon vrai code que j'utilisais en réalité BindingList dans le ViewModel, mais une liste dans le contrôle personnalisé. Changer pour utiliser une BindingList également dans le contrôle personnalisé a résolu le problème. Merci Ilya! :) – haagel