C#WPF MVVM绑定不更新
我正在尝试使用转换器进行简单绑定,以显示满足给定枚举的可观察集合内的元素计数,让我们说ABC D.
当我用我的其他项目测试它时,下面的代码工作,但是最基本的项目绑定没有得到更新。 完全相同的代码在其他项目中工作(真的很奇怪)。
我是如何做绑定的
变流器
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(); } }
模型
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)); } } }
视图模型
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)); } } }
我试图开始工作的简单测试用例
for (var i = 0; i != 100; i++) { TestViewModel.Instance.TestModels.Add(new TestModel()); }
您绑定到TestModels
集合,因此只有在该属性更改时才会调用转换器。 您的循环更改集合中的元素,但它不会更改TestModels
本身的值。 如果你想要这个,那么你基本上有两个选择:
1)使用附加行为,并在首次创建TestModels
绑定时使其订阅INotifyCollectionChanged CollectionChanged
属性。 然后,它需要某种方式将结果提供回Label,这可以通过单独的附加属性来实现。
2)在你的视图模型中完成所有这些操作,无论如何它应该是应该完成的。 每当您发现自己在转换器中执行除基本的,与应用程序无关的最基本任务之外的任何事情时,通常都表明您的视图模型层无法正常工作。