[WPF] Binding sur une collection : notifié sur MAJ d'un élément ?
Bonjour, voilà encore une question sur le binding.
Si je binde un contrôe sur un ObservableCollection<ClassA>.
Je ne suis pas notifiée sur la modification d'une propriété d'un des éléments ClassA de ma collection, bien qu'elle implémente INotifyPropertyChanged.
Quelle est la solution sachant que je suis obligée de ma binder sur la collection et non sur l'élément, car je ne connais pas par avance son index.
Merci !!
Le problème c'est l'utilisation d'un converter ?
Au final, ça n’est pas lié à l’ObservableCollection.
Il semble que le binding ne se fait pas si j’utilise un converter.
J’ai isolé un exemple simple où je binde une instance de la classe Test à une textbox.text.
Ma classe de test qui implémente : INotifyPropertyChanged
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
public class Test : INotifyPropertyChanged
{
private string m_Value;
public string Value
{
get
{
return m_Value;
}
set
{
m_Value = value;
onPropertyChanged("Value");
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged
{
add
{
PropertyChanged += value;
}
remove
{
PropertyChanged -= value;
}
}
protected void onPropertyChanged(string PropertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
}
#endregion
} |
Le binding d’un élément à une textbox « tbtest »
Code:
1 2 3 4 5 6 7 8
|
Test test = new Test();
Binding bind = new Binding("");
bind.Mode = BindingMode.OneWay;
bind.Converter = new TestConverter();
tbtest.SetBinding(TextBox.TextProperty, bind);
tbtest.DataContext = test; |
Le converter:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
namespace D18WPFBindingLibtest
{
public class TestConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
return null;
Test test = value as Test;
return test.Value;
}
public object ConvertBack(object value, Type TargetType, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}
} |
Maintenant, si je modifie test.Value via le code, ma textbox n'est pas rafraichie.
Par-contre, si je force le refresh du binding à la main, par un Updatetarget() sur la binding expression, ma textbow se rafraichit correctement.
Si je n'utilise pas le converter et que le Path de mon binding test.Value, le refresh fonctionne !
Une idée ?
Merci d’avance mille fois !