ContextMenu があり、ViewModel クラスからリストをバインドしようとしています。2 つの異なるメソッドを使用して、このリストを設定します。OnZonesReceived
変更が行われるとOnItemReceived
メソッドがトリガーされ、選択されたタブ項目が変更されるとメソッドがトリガーされます。このプロジェクトには tabItems があり、各 tabItem には独自の DesignerCanvas があります。
問題はZones
、選択したタブのアイテムが変更されたときに更新されますが、メソッドがトリガーされている間に DesignerCanvas が更新されたときに更新されず、OnZonesReceived
入力「キャンバス」には正しい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>
ビューモデル
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));
}
}
}