簡體   English   中英

C#WPF MVVM綁定未更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM