我有一个 ContextMenu,我正在尝试从我的 ViewModel 类中绑定一个列表。我使用两种不同的方法设置了这个列表。OnZonesReceived
进行更改时OnItemReceived
触发方法,并在选定的选项卡项更改时触发方法。在这个项目中,我有 tabItems,每个 tabItem 都有自己的 DesignerCanvas。
The problem is Zones
is updated when selected tab Item changed but it is not updated when DesignerCanvas updated while OnZonesReceived
method is triggered and The input "canvas" has the correct Zones
List.
资源字典
<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>
视图模型
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));
}
}
}