Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将相同的动态上下文菜单绑定到动态数量的用户控件?_C#_Wpf_Dynamic_Binding_Contextmenu - Fatal编程技术网

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