将记录添加到 CollectionViewSource 资源,而不是显示在绑定的 ListView 中

Adding records to a CollectionViewSource resource, not showing up in a bound ListView

首先,这是我第一次尝试使用 WPF。我将尽量保留尽可能多的信息,因为这种数据输入表单比典型的要少一些。但是,如果需要更多信息,请询问。

我有一个 WPF window,在我的 Window.Resources 集合中有一系列 CollectionViewSource 对象。这些是在我的 window 的构造函数中初始化的。

其中一个集合是 IList<T>,其中 T 是与 Entity Framework 一起使用的 POCO 类型。

我的表单有一段用户输入控件。当用户点击 Save 按钮时,我需要创建一个实体并将其添加到我的 IList 集合中。

到目前为止,我没有遇到任何问题。我可以创建实体,并且可以毫无问题地将它添加到集合中。但是,问题是我有一个绑定到此集合的 ListView 控件。我可以并且已经验证,当 Window 在构造函数 中初始化时,我可以将记录加载到此列表 。但是,当我单击 Save 按钮时,集合会更新,但 UI 不会刷新操作。

作为参考,下面是相关代码。

SetResource() - 在我的 Window

的构造函数中调用
    private void SetResources()
    {
        ... other objects...

        //myCacheSrc is property defined in my Window.cs file.
        myCacheSrc = (CollectionViewSource)FindResource("myCacheSrc");
        myCacheSrc.Source = new List<MyEFPOCO>();

        ... more initializations of other objects.
    }

我的保存按钮点击事件的内容

    private void Save_Click(object sender, RoutedEventArgs e)
    {
        var cache = myCacheSrc.Source as List<MyEFPOCO>;
        if (cache != null && !CurrentRecord.Equals(origCurrentRecord))
        {
            cache.Add(CurrentRecord);
        }
    }

值得一提的是,我已经逐步完成了上面的代码块。它在保存事件上执行,CurrentRecord 属性 确实包含有效实体。

这是我的 Window 构造函数。请注意,有一个测试插入操作。这行得通!请注意,它与我的按钮事件中的代码没有太大区别。为什么这行得通,而不是按钮事件?

Window构造函数

    public MyWindow()
    {
        InitializeComponent();
        SetResources();

        //TEST
        var cache = myCacheSrc.Source as List<MyEFPOCO>;
        if (cache != null)
        {
            cache.Add(new MyEFPOCO
                { 
                    userEntryType = "TEST",
                    numberValue= 1234567
                });
        }
    }

MyWindow.xaml - 有问题的 ListView 声明

        <ListView Name="CachedChangesList" ItemsSource="{Binding Source={StaticResource myCacheSrc}}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <DockPanel>
                        <Button Name="UpdateChange" Content="{StaticResource iUpdate}" Width="20" />
                        <Button Name="DeleteChange" Content="{StaticResource iDelete}" Width="20" />
                        <Label Content="{Binding userEntryType}" />
                        <Label Content="{Binding numberValue}" />
                    </DockPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

使用 ObservableCollection 而不是 List,因为它会通知 UI 有关源更改的信息。 https://msdn.microsoft.com/en-us/library/ms668604(v=vs.110).aspx

 myCacheSrc = (CollectionViewSource)FindResource("myCacheSrc");
        myCacheSrc.Source = new ObservableCollection<MyEFPOCO>();