[英]C# WPF MVVM Binding not updating
我正在嘗試使用轉換器進行簡單綁定,以顯示滿足給定枚舉的可觀察集合中的元素計數,比方說ABCD。
當我與其他項目一起測試時,下面的代碼可以工作,但是在最基本的項目綁定中不會更新。 完全相同的代碼可以在其他項目中使用(真的很奇怪)。
我如何進行裝訂
<Label Content="{Binding Source={x:Static viewmodels:TestViewModel.Instance}, Path=TestModels, Converter={StaticResource TestConverter}, Mode=OneWay}"></Label>
轉換器
class TestConverter : IValueConverter
{
public object Convert(
object value,
Type targetType,
object parameter,
CultureInfo culture)
{
if (value == null)
return 0;
var v = (ObservableCollection<TestModel>)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<TestModel> _testModels;
private TestViewModel()
{
_testModels = new ObservableCollection<TestModel>();
}
public ObservableCollection<TestModel> 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)在您的視圖模型中執行所有這些操作,這實際上是應該執行的操作。 每當您發現自己在轉換器中執行除最基本的,與應用程序無關的任務以外的任何操作時,通常表明您的視圖模型層無法正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.