Liaison MVVM C # WPF non mise à jour

J’essaie de faire une liaison simple en utilisant un convertisseur pour afficher le nombre d’éléments dans une collection observable qui satisfont une énumération donnée, supposons ABC D.

Le code ci-dessous fonctionne lorsque je le teste avec mon autre projet, mais la liaison de projet la plus élémentaire n’est pas mise à jour. Le même code fonctionne dans un autre projet (vraiment étrange).

Comment je fais la reliure

 

Convertisseur

 class TestConverter : IValueConverter { public object Convert( object value, Type targetType, object parameter, CultureInfo culture) { if (value == null) return 0; var v = (ObservableCollection)value; return $"{v.Count} / {v.AsParallel().Count(x => x.TestEnum == TestEnum.A)} / {v.AsParallel().Count(x => x.TestEnum == TestEnum.B)} / {v.AsParallel().Count(x => x.TestEnum == TestEnum.C)} / {v.AsParallel().Count(x => x.TestEnum == TestEnum.D)}"; } public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } 

Modèle

 public enum TestEnum { A, B, C, D } public class TestModel:INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private TestEnum _testEnum; public TestModel() { TestEnum = (TestEnum)(TestViewModel.Instance.rnd.Next(0,3)); } public TestEnum TestEnum { get { return _testEnum; } set { _testEnum = value; PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(null)); } } } 

ViewModel

 public class TestViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private static readonly TestViewModel _instance = new TestViewModel(); public Random rnd = new Random(); public static TestViewModel Instance { get { return _instance; } } private ObservableCollection _testModels; private TestViewModel() { _testModels = new ObservableCollection(); } public ObservableCollection TestModels { get { return _testModels;} set { _testModels = value; PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(null)); } } } 

Cas de test simple que j’essaye de me mettre au travail

 for (var i = 0; i != 100; i++) { TestViewModel.Instance.TestModels.Add(new TestModel()); } 

Vous vous TestModels collection TestModels , le convertisseur ne sera appelé que lorsque cette propriété sera modifiée. Votre boucle modifie les éléments de la collection mais ne modifie pas la valeur de TestModels elle-même. Si vous voulez que cela fonctionne, vous avez essentiellement deux options:

1) Utilisez un comportement attaché et INotifyCollectionChanged CollectionChanged le à la propriété INotifyCollectionChanged CollectionChanged lors de la TestModels création de la liaison TestModels . Il faudra ensuite trouver un moyen de renvoyer le résultat à l’étiquette, ce qui peut être obtenu avec une propriété attachée distincte.

2) Faites tout cela dans votre modèle de vue, qui est vraiment ce qui devrait être fait de toute façon. Chaque fois que vous vous trouvez à faire autre chose que les tâches les plus élémentaires et indépendantes de l’application dans vos convertisseurs, cela signifie généralement que votre couche de modèle de vue ne fonctionne pas correctement.