gpt4 book ai didi

c# - 如何使用 MVVM 更新 ContextMenu 的 ItemSource

转载 作者:行者123 更新时间:2023-12-03 10:43:00 25 4
gpt4 key购买 nike

我有一个 ContextMenu,我正在尝试从我的 ViewModel 类中绑定(bind)一个列表。我使用两种不同的方法设置了这个列表。 OnZonesReceived方法在进行更改时触发,OnItemReceived选择的选项卡项更改时触发方法。在这个项目中,我有 tabItems,每个 tabItem 都有自己的 DesignerCanvas。

问题是Zones is updated when selected tab Item changed but it is not updated when DesignerCanvas updated while OnZonesReceived方法被触发并且输入“ Canvas ”具有正确的Zones列表。

资源字典

<MenuItem Header="Zones" ItemsSource="{Binding Zones, Mode=TwoWay}">
<MenuItem.DataContext>
<viewModel:ZoneViewModel/>
</MenuItem.DataContext>
<MenuItem.ItemTemplate>
<DataTemplate DataType="{x:Type dataModel:ZoneModel}" >
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>

View 模型
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using Core.Media;
using PropulsimGUI.Controls;
using PropulsimGUI.DataModel;
using PropulsimGUI.Utilities;

namespace PropulsimGUI.ViewModel
{
public class ZoneViewModel : INotifyPropertyChanged
{
public ZoneViewModel()
{
Messenger.Default.Register<ClosableTab>(this, OnItemReceived);
Messenger.Default.Register<DesignerCanvas>(this, OnZonesReceived, "Zone");
}

private void OnZonesReceived(DesignerCanvas canvas)
{
Zones = canvas.Zones;
}

public void OnItemReceived(ClosableTab item)
{
Zones = item.DesignerCanvas.Zones;
}

private List<ZoneModel> _zones;

public List<ZoneModel> Zones
{
get { return _zones; }

set
{
_zones = value;
RaisePropertyChanged("Zones");
}
}

public event PropertyChangedEventHandler PropertyChanged;

public void RaisePropertyChanged(string propertyThatChanged)
{
//checking if event is not null than raise event and pass
//in propperty name that has changed
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyThatChanged));
}
}
}

最佳答案

您没有提供足够的信息,但正如我所见,如果事件 OnZonesReceived被调用和代码 Zones = item.DesignerCanvas.Zones;有效,那么 Zones = canvas.Zones; 的唯一原因不起作用是canvas.Zones是同一个对象,在这种情况下,尽管 RaisePropertyChanged("Zones");绑定(bind)到Zones不会更新。 IE。代码

Zones.Add(new ZoneModel());
Zones=Zones;

不会更新 ItemsSource。

您的解决方案可以是:
private void OnZonesReceived(DesignerCanvas canvas)
{
Zones = new List<ZoneModel>(canvas.Zones);
}

关于c# - 如何使用 MVVM 更新 ContextMenu 的 ItemSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46218570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com