将记录添加到 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>();
首先,这是我第一次尝试使用 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>();