1

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

The problem is Zonesis updated when selected tab Item changed but it is not updated when DesignerCanvas updated while OnZonesReceivedmethod is triggered and The input "canvas" has the correct ZonesList.

资源字典

<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

0

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

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

不会更新 ItemsSource。

您的解决方案可以是:

private void OnZonesReceived(DesignerCanvas canvas)
{
    Zones = new List<ZoneModel>(canvas.Zones);
}
于 2018-02-13T07:58:52.987 回答