【问题标题】:Binding WPF ContextMenu Submenu to a Collection将 WPF ContextMenu 子菜单绑定到集合
【发布时间】:2012-12-02 23:19:07
【问题描述】:

尝试获取要绑定到 ObservableCollection 的子菜单项列表。

我可以让绑定在顶级菜单上工作。如果我在代码中添加它们,我也可以让它们显示在子菜单中,我想避免这种情况。

MainWindow.xaml:

    <ContextMenu x:Key="tbMenu" >

        <-- Top level menu item -->
        <MenuItem Name="menuLaunchJob" Header="Launch a Job" >
            <-- Display a list of the available jobs in a submenu -->
            <MenuItem.ItemTemplate>    <-- This doesn't work -->
                <DataTemplate>
                    <MenuItem ItemsSource="{Binding}" Header="{Binding jobName}" />
                </DataTemplate>
            </MenuItem.ItemTemplate>
        </MenuItem>

        <-- Top level menu item -->
        <MenuItem Name="menuEditJobs" Header="Edit Jobs" >
    </ContextMenu>

    <!-- Globally declared notify icon -->
    <tb:TaskbarIcon x:Key="StatusIcon" 
                    MenuActivation="LeftOrRightClick" 
                    ContextMenu="{StaticResource tbMenu}" />

MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    private static TaskbarIcon mTaskBar = null;

    public MainWindow()
    {
        JobsClass jc = new JobsClass();

        Environment.CurrentDirectory = System.AppDomain.CurrentDomain.BaseDirectory;
        InitializeComponent();
        mTaskBar = (TaskbarIcon)this.FindResource("StatusIcon");

        // Job sub-menu list is always the 1st item in the main menu
        MenuItem launchJob = (MenuItem)mTaskBar.ContextMenu.Items[0];
        launchJob.DataContext = jc.mJobs;
    }

    public class JobsClass
    {
        private static JobConfig mJobConfig = JobConfig.Instance;
        public ObservableCollection<JobConfig.JobData> mJobs = new ObservableCollection<JobConfig.JobData>();

        public JobsClass()
        {
            mJobConfig.ReadJobs(); 
            foreach (JobConfig.JobData job in mJobConfig.GetJobs())
            {
                mJobs.Add(job);
            }
        }
    }
}

【问题讨论】:

    标签: wpf contextmenu observablecollection


    【解决方案1】:

    试试这个:

        <-- Top level menu item -->
        <MenuItem Name="menuLaunchJob" Header="Launch a Job" ItemsSource="{Binding}" DisplayMemberPath="jobName">
    

    (假设您的 {Binding} 设置为您的 ObservableCollection)

    【讨论】:

    • 你是在建议我摆脱 MenuItem.ItemTamplate 吗?如果我这样做,子菜单会显示正确数量的项目,但没有标题。不确定如何使 DisplayMemberPath 与每个子菜单项的标题一起使用。
    • 好的,让它工作。我需要将 jobName 转换为属性。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多