1

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));
        }
    }
}
4

1 に答える 1