C# 如何将相同的动态上下文菜单绑定到动态数量的用户控件?
想象一下: 你有许多控件,你想有一个上下文菜单,相同的菜单。该上下文菜单将是动态的,可以随时更改。因此,创建一个静态类,如下所示:C# 如何将相同的动态上下文菜单绑定到动态数量的用户控件?,c#,wpf,dynamic,binding,contextmenu,C#,Wpf,Dynamic,Binding,Contextmenu,想象一下: 你有许多控件,你想有一个上下文菜单,相同的菜单。该上下文菜单将是动态的,可以随时更改。因此,创建一个静态类,如下所示: public static class EmployeeContextMenu { private static ContextMenu EmployeeMenu { get; set; } static EmployeeContextMenu() { EmployeeMenu = new ContextMenu();
public static class EmployeeContextMenu
{
private static ContextMenu EmployeeMenu { get; set; }
static EmployeeContextMenu()
{
EmployeeMenu = new ContextMenu();
}
public static ContextMenu Get()
{
return EmployeeMenu;
}
public static void Set(List<String> employees)
{
EmployeeMenu = new ContextMenu();
MenuItem mi;
foreach (var item in employees)
{
mi = new MenuItem();
mi.Header = item;
EmployeeMenu.Items.Add(mi);
}
}
}
但是,如果您有未知数量的动态创建的用户控件,而您非常希望动态更新所提到的上下文菜单,那么这将是一个糟糕的解决方案。您可以做的是重新构造它,因为您需要EmployeeMenu属性的更改通知,以便在设置后更新方法
EmployeeContextMenu.Instance.Set(list);
因此,从类本身开始
namespace CSharpWPF
{
public sealed class EmployeeContextMenu : INotifyPropertyChanged
{
private EmployeeContextMenu()
{
//prevent init
}
static EmployeeContextMenu()
{
Instance = new EmployeeContextMenu();
Instance.EmployeeMenu = new ContextMenu();
}
public static EmployeeContextMenu Instance { get; private set; }
private ContextMenu _menu;
public ContextMenu EmployeeMenu
{
get
{
return _menu;
}
set
{
_menu = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("EmployeeMenu"));
}
}
public void Set(List<String> employees)
{
EmployeeMenu = new ContextMenu();
MenuItem mi;
foreach (var item in employees)
{
mi = new MenuItem();
mi.Header = item;
EmployeeMenu.Items.Add(mi);
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
调用集合方法
EmployeeContextMenu.Instance.Set(list);
因此,整个想法是启用属性更改通知,同时保留为静态引用绑定看起来正常,您确定EmployeeMenu不是空的吗?我们必须先通过set方法设置项目。另外,如果绑定有问题,您可以尝试查看输出窗口,那里应该有一些消息。我觉得我需要任何类型的通知,但无法应用于静态类,因此我被困在那里。你的方式,工作完美!
<Grid xmlns:l="clr-namespace:CSharpWPF">
<TextBlock Name="tb" ContextMenu="{Binding EmployeeMenu,Source={x:Static l:EmployeeContextMenu.Instance}}" />
</Grid>
EmployeeContextMenu.Instance.Set(list);