【问题标题】:WPF MVVM Dynamic ContextMenuWPF MVVM 动态上下文菜单
【发布时间】:2014-01-15 07:02:06
【问题描述】:
<Custom:DataGrid.ContextMenu>
            <ContextMenu ItemsSource="{Binding MenuItemsList, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
</Custom:DataGrid.ContextMenu>

public ObservableCollection<MenuItem> MenuItemsList
        {
            get
            {
                     ObservableCollection<MenuItemClass> list = new ObservableCollection<MenuItemClass>();
                if (SelectedInspection != null)
                {
                    switch (SelectedInspection.state.s_serverid)
                    {
                        case 1:
                        case 2:
                            list.Add(medit);
                            break;
                        case 3:
                            list.Add(msync);
                            list.Add(mview);
                            list.Add(mnewdoc);
                            break;
                        case 4:
                            list.Add(mview);
                            list.Add(mdelete);
                            break;
                    }
                }
               return list;
            }
            set
            {
                OnPropertyChanged("MenuItemsList");
            }
        }

ContextMenu (CM) 在 UserControl 1 (UC1) 中。 窗口有 2 个用户控件和用于选择此控件的主菜单。

选择 UC1
使用 CM - 好的
选择 UC2
选择 UC1
使用 CM - 好的

但是
选择 UC1
使用 CM - 好的
选择 UC1
使用 CM - 不更新 CM 项目

我想我应该在创建 UC1 的新视图模型时更新 UC1 的视图,但是如何? 还是我应该重写 ContextMenu 实现?

【问题讨论】:

  • 只是一个小信息:您不应该使用 UIElement 的类型创建 ObservableCollections。您应该在这里使用一个包含您的业务逻辑的对象。
  • @Tomtom 你的意思是“自己的课程”吗?
  • 是的,我就是这个意思
  • @Tomtom 我改了,还是不行=(
  • 这些课程与您的问题没有任何关系。这只是使用 MVVM 的信息。我不明白您的问题:如果您选择 UC1,那么上下文菜单项就可以了。然后您再次选择 UC1 并且您的上下文菜单项集合不会更新。这是正确的,因为集合不会改变。您仍然拥有相同的 UserControl

标签: c# wpf mvvm


【解决方案1】:

好的。

首先:

getter 中的代码应该移到模型中。

现在解决你的问题:

你的 setter 应该是这样的

set
{
   this.MenuItemsList = value;
   OnPropertyChanged("MenuItemsList");
}

【讨论】:

  • 在get中应该只有return list = GetMenu(); ?
  • 通常在 MVVM 中,每个属性都有一个后端字段。然后该属性仅设置/获取后端字段并在设置器中触发 OnPropertyChanged
  • 我知道,但是如果我写在片场,那么什么时候会调用set呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多