2016-04-12 7 views
0

güncellemiyor Cilt, bunu test ederken enC# WPF MVVM Ben enum verilen Karşılamanız gözlemlenebilir koleksiyonu içindeki elemanların sayısını görüntülemek için bir dönüştürücü kullanarak basit bağlama yapmaya çalışıyorum

Aşağıdaki kod çalışır ABC D. diyelim diğer projemle birlikte, ancak en temel proje bağlamada güncellenmiyor. Tam olarak aynı kod diğer projenin içinde çalışır (gerçekten garip). Ben bağlayıcı

<Label Content="{Binding Source={x:Static viewmodels:TestViewModel.Instance}, Path=TestModels, Converter={StaticResource TestConverter}, Mode=OneWay}"></Label> 

Converter

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(); 
    } 
} 

Modeli

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<TestModel> _testModels; 

    private TestViewModel() 
    { 
     _testModels = new ObservableCollection<TestModel>(); 
    } 

    public ObservableCollection<TestModel> TestModels 
    { 
     get { return _testModels;} 
     set 
     { 
      _testModels = value; 
      PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(null)); 
     } 
    } 
} 
yapıyorum Nasıl

Ben çalışıyorum

Basit test durumu Sen TestModels koleksiyonuna bağlanmasının, o yüzden dönüştürücü yalnızca o mülkiyet değişiklikleri çağrılan olacak

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

her ikisi de C# 6 kullanıyor? dönüştürücünün çağrılıp yapılmadığını kontrol edebilir misin? – sexta13

cevap

1

işe alır. Döngününüz koleksiyondaki öğeleri değiştirir ancak TestModels'un değerini değiştirmez. Bunun işe yaramasını istiyorsanız, temel olarak iki seçeneğiniz vardır:

1) Ekli bir davranış kullanın ve ilk olarak TestModels ilk cilt oluşturulduğunda INotifyCollectionChanged CollectionChanged özelliğine abone olun. Ardından, Etikete ayrı bir ek özellik ile ulaşılabilen, sonucun Etikete geri verilmesinin bir yoluna ihtiyaç olacaktır.

2) Tüm bunları sizin görünüm modelinizde yapın, ki bu gerçekten zaten yapılması gereken yerde. Dönüştürücünüzdeki en temel, uygulamadan bağımsız görevler yerine bir şey yaptığını her an gördüğünüzde, genellikle görünüm model katmanın işini düzgün yapmadığının bir işareti olur.

İlgili konular