我有一个ListView,它显示一个字符串值列表.我想为列表中的每个项目添加上下文菜单条目以删除所选项目.我的XAML看起来像这样:
<ListView x:Name="itemsListView" ItemsSource="{Binding MyItems}">
<ListView.ContextMenu>
<ContextMenu>
<MenuItem Header="Remove"
Command="{Binding RemoveItem}"
CommandParameter="{Binding ElementName=itemsListView, Path=SelectedItem}" />
</ContextMenu>
</ListView.ContextMenu>
</ListView>
Run Code Online (Sandbox Code Playgroud)
问题是该CommandParameter值始终为null.我添加了一个额外的按钮来删除所选项目以检查我的命令是否有效.该按钮具有完全相同的绑定,并通过按钮删除项目工作.按钮看起来像这样:
<Button Content="Remove selected item"
Command="{Binding RemoveItem}"
CommandParameter="{Binding ElementName=itemsListView, Path=SelectedItem}"/>
Run Code Online (Sandbox Code Playgroud)
该命令如下所示:
private ICommand _removeItem;
public ICommand RemoveItem
{
get { return _removeItem ?? (_removeItem = new RelayCommand(p => RemoveItemCommand((string)p))); }
}
private void RemoveItemCommand(string item)
{
if(!string.IsNullOrEmpty(item))
MyItems.Remove(item);
}
Run Code Online (Sandbox Code Playgroud)
打开上下文菜单时所选项目为空的任何想法?也许是listview的焦点问题?
我们已在 Azure Web 应用程序(Windows 应用服务计划)上运行的 ASP.NET Core 5.0 Web 项目上启用了 SignalR。我们的 SignalR 客户端是使用 NPM 包(版本 5.0.11)的 Angular 客户端@microsoft/signalr。
我们的枢纽位于/api/hub/notification。
对于大多数客户端来说,一切都按预期进行,Web 套接字连接已建立,我们可以从客户端调用到服务器的方法,反之亦然。
对于我们的一些客户,我们看到在短时间内收到大量请求(每个客户端每分钟多个请求)POST /api/hub/notification/negotiate。POST /api/hub/notification自从我们看到请求以来,这些客户端似乎切换到长轮询而不是使用 Web 套接字POST /api/hub/notification。
我们怀疑受影响的客户端可能位于代理或防火墙后面,这些代理或防火墙禁止 Web 套接字,因此连接首先切换为长轮询。
以下屏幕截图显示了单个用户在短时间内向集线器端点发出的请求。该列表很长,因为只要用户打开我们的网站,这种模式就会重复。我们看到两个奇怪的事情:
/negotiate每 15 秒重复调用两次。POST /notification?id=<connectionId>恰好需要 15 秒,并且具有相同连接 ID 的后续调用将返回 404 响应。然后该模式重复并/negotiate再次被调用。出于测试目的,我们仅在客户端中启用长轮询。这也符合我们的预期。不幸的是,我们目前无法访问发生此行为的用户的浏览器或网络,因此我们很难重现该问题。
更多注意事项:
有没有办法让ShouldSerialize*模式合作DataContractSerializer?
这是一个小例子:
我有一个简单的类Person,看起来像这样:
[DataContract]
public class Person
{
[DataMember]
public string FirstName { get; set; }
public bool ShouldSerializeFirstName()
{
return !string.IsNullOrEmpty(FirstName);
}
[DataMember]
public string LastName { get; set; }
public bool ShouldSerializeLastName()
{
return !string.IsNullOrEmpty(LastName);
}
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public Person(string firstName)
{
FirstName = firstName;
}
public Person()
{
}
}
Run Code Online (Sandbox Code Playgroud)
FirstName或者LastName只有在它们不为空或空时才应序列化.这适用XmlSerializer但DataContractSerializer似乎忽略了ShouldSerialize模式.该 …