在UWP应用程序中,如何对ObservableCollection进行分组和排序并保持所有实时通知的良好性?
在我看过的大多数简单的UWP示例中,通常有一个ViewModel公开一个ObservableCollection,然后绑定到View中的ListView.在ObservableCollection中添加或删除项目时,ListView会通过对INotifyCollectionChanged通知作出反应来自动反映更改.在未分类或未分组的ObservableCollection的情况下,这一切都可以正常工作,但如果需要对集合进行排序或分组,则似乎没有明显的方法来保留更新通知.更重要的是,动态更改排序或组顺序似乎会引发重大的实施问题.
++
假设您有一个现有的datacache后端,该后端公开了一个非常简单的类Contact的ObservableCollection.
public class Contact
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string State { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
此ObservableCollection随时间而变化,我们希望在视图中呈现实时分组和排序列表,以响应datacache中的更改进行更新.我们还希望为用户提供在运行时切换LastName和State之间的分组的选项.
++
在WPF世界中,这是相对微不足道的.我们可以创建一个简单的ViewModel,引用数据缓存,按原样显示缓存的Contacts集合.
public class WpfViewModel
{
public WpfViewModel()
{
_cache = GetCache();
}
Cache _cache;
public ObservableCollection<Contact> Contacts
{
get { return _cache.Contacts; }
}
}
Run Code Online (Sandbox Code Playgroud)
然后我们可以将它绑定到一个视图,我们将CollectionViewSource和Sort和Group定义实现为XAML资源.
<Window .....
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase">
<Window.DataContext>
<local:WpfViewModel />
</Window.DataContext>
<Window.Resources>
<CollectionViewSource x:Key="cvs" Source="{Binding Contacts}" />
<PropertyGroupDescription x:Key="stategroup" PropertyName="State" />
<PropertyGroupDescription x:Key="initialgroup" PropertyName="LastName[0]" />
<scm:SortDescription …
Run Code Online (Sandbox Code Playgroud) UWP应用程序和Outlook桌面版本之间的应用程序到应用程序通信一直存在问题.
在UWP中创建附件,然后尝试在桌面版电子邮件客户端(如Outlook 2013或2016)中显示和使用它们时会出现问题.
在UWP应用程序中创建电子邮件和附件并使用以下代码将其显示给用户是相对微不足道的.
EmailMessage emailMessage = new EmailMessage();
emailMessage.Body = "Text for mail body here";
var attachment = new EmailAttachment("myattachment.jpg", attachmentContentsStreamRef);
emailMessage.Attachments.Add(attachment);
await EmailManager.ShowComposeNewEmailAsync(emailMessage);
Run Code Online (Sandbox Code Playgroud)
如果Windows 10 Mail应用程序是用户的默认电子邮件客户端,则此方法有效.但是,如果用户将桌面电子邮件客户端设置为默认值,则无法正确生成邮件附件并显示空白电子邮件.
这已在各种论坛上多次查询,但微软代表的一般回复似乎是"可能需要一些时间才能修复此问题."
有关代表性样本,请参阅以下链
如何使用C#for Windows App store以编程方式将文件作为电子邮件附件附加
通过UWP EmailManager发送电子邮件附件无法正常工作
除非您使用Brokered Windows运行时组件,否则似乎没有解决办法, 但这需要用户通过Powerscript安装您的UWP应用程序并安装组件.在非技术用户的现实世界中不实用.
++
到目前为止我的想法
如果用户使用的是基于Microsoft Web的邮件存储(例如Office 365/Hotmail.com/Outlook.com等),则看起来可以使用Outlook Mail REST API生成邮件和附件.这可能是这些案例的解决方案,但在本地而不是通过远程服务器传递app-to-app似乎更合理,用户体验在很大程度上取决于客户端与服务器同步的速度.另一方面,如果用户的电子邮件是基于POP3的,我们基本上没有运气.
或者,我推测可能为Outlook桌面版本编写一个加载项,使其能够公开UWP兼容的共享目标接口并从UWP应用程序传输附件?但是我不清楚你将如何尝试实现它.
有没有人找到一个可行的解决方案?