C# 如何使用MVVM更新ContextMenu的ItemSource
我有一个ContextMenu,我正试图从我的ViewModel类绑定一个列表。我使用两种不同的方法设置此列表<代码>OnZoneReceived方法在进行更改时触发,而C# 如何使用MVVM更新ContextMenu的ItemSource,c#,wpf,mvvm,contextmenu,itemsource,C#,Wpf,Mvvm,Contextmenu,Itemsource,我有一个ContextMenu,我正试图从我的ViewModel类绑定一个列表。我使用两种不同的方法设置此列表OnZoneReceived方法在进行更改时触发,而OnItemReceived方法在所选选项卡项更改时触发。在这个项目中,我有tabItems,每个tabItem都有自己的DesignerCanvas 问题是,Zones在所选选项卡项更改时更新,但在触发onzonerseceived方法且输入“canvas”具有正确的Zones列表时,DesignerCanvas更新时不会更新 资源字
OnItemReceived
方法在所选选项卡项更改时触发。在这个项目中,我有tabItems,每个tabItem都有自己的DesignerCanvas
问题是,Zones
在所选选项卡项更改时更新,但在触发onzonerseceived
方法且输入“canvas”具有正确的Zones
列表时,DesignerCanvas更新时不会更新
资源字典
视图模型
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Controls;
使用核心媒体;
使用PropulsimGUI.控件;
使用PropulsimGUI.DataModel;
使用PropulsimGUI.Utilities;
命名空间PropulsimGUI.ViewModel
{
公共类ZoneView模型:INotifyPropertyChanged
{
公共区域视图模型()
{
Messenger.Default.Register(此,已接收);
Messenger.Default.Register(此,onzonerseceived,“Zone”);
}
收到的分区上的专用空白(DesignerCanvas画布)
{
区域=画布。区域;
}
收到的公共文件(ClosableTab项)
{
分区=item.DesignerCanvas.Zones;
}
私人列表区;
公共列表区
{
获取{return\u zones;}
设置
{
_分区=值;
RaiseProperty变更(“区域”);
}
}
公共事件属性更改事件处理程序属性更改;
public void RaisePropertyChanged(字符串属性AtchChanged)
{
//检查事件是否不为null,而不是raise event和pass
//在已更改的属性名称中
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(PropertyTatchanged));
}
}
}
您没有提供足够的信息,但正如我所看到的,如果调用eventOnZonesReceived
,并且codeZones=item.DesignerCanvas.Zones代码>有效,那么Zones=canvas.Zones代码>不起作用的原因是canvas.Zones
是同一个对象,在本例中,尽管RaisePropertyChanged(“Zones”)代码>绑定到
区域
将不会更新。即代码
Zones.Add(new ZoneModel());
Zones=Zones;
不会更新ItemsSource
您的解决方案可以是:
private void OnZonesReceived(DesignerCanvas canvas)
{
Zones = new List<ZoneModel>(canvas.Zones);
}
已接收的分区上的私有无效(DesignerCanvas画布)
{
区域=新列表(canvas.Zones);
}
您没有提供足够的信息,但正如我所看到的,如果调用eventOnZonesReceived
,并且codeZones=item.DesignerCanvas.Zones代码>有效,那么Zones=canvas.Zones代码>不起作用的原因是canvas.Zones
是同一个对象,在本例中,尽管RaisePropertyChanged(“Zones”)代码>绑定到
区域
将不会更新。即代码
Zones.Add(new ZoneModel());
Zones=Zones;
不会更新ItemsSource
您的解决方案可以是:
private void OnZonesReceived(DesignerCanvas canvas)
{
Zones = new List<ZoneModel>(canvas.Zones);
}
已接收的分区上的私有无效(DesignerCanvas画布)
{
区域=新列表(canvas.Zones);
}
这里的问题是什么?因为“为什么区域=画布。区域;不起作用”不是一个问题。这里的问题是什么?因为“为什么区域=canvas.Zones;不起作用”不是一个问题。