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

时间:2015-02-11 20:11:22

标签: c# wpf xaml listview collectionviewsource

首先,这是我第一次尝试使用WPF。我会尝试尽可能多地提供信息,因为这种数据输入形式比典型的要少一些。但是,如果需要更多信息,请询问。

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

其中一个集合是IList<T>,其中T是与实体框架一起使用的POCO类型。

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

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

供参考,以下是相关代码。

SetResource() - 在我的窗口的构造函数中调用

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

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

这是我的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>

1 个答案:

答案 0 :(得分:2)

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

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