绑定不适用于从另一个任务分配的 属性

binding not working with a property assigned from another Task

有人可以快速告诉我为什么绑定到 VesselCollection 的 DataGrid 不显示任何内容。 ReferentialVesselViewModel class 是 ReferentialVesselView 视图的 DataContext(在 XAML 下方)。 DataGrid 的 ItemsSource 是 VesselCollection,这是一个 ObservableCollection。

 public class ReferentialVesselViewModel : ViewModelBase
    {
        public ReferentialVesselViewModel()
        {
           Task.Factory.StartNew(() =>
                    App.Current.Dispatcher.BeginInvoke(new Action(() =>
                    {

                        VesselEntities = ServiceProxy.Load<VesselProxy, IEnumerable<Vessel>>(proxy => proxy.GetVesselTable());

                        foreach (var vessel in VesselEntities)
                            VesselCollection.Add(new ReferentialVesselLineViewModel(vessel));
                    })));
        }

        public ObservableCollection<ReferentialVesselLineViewModel> VesselCollection { get; private set; }
    }

Xaml这边是代码

<UserControl  
    x:Class="MyCompany.Referential.ReferentialVesselView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:ViewModels="clr-namespace:MyCompany.ViewModel"
    >

    <UserControl.DataContext>
        <ViewModels:ReferentialVesselViewModel/>
    </UserControl.DataContext>

    <Border BorderThickness="0.5" BorderBrush="SteelBlue" Margin="5" Padding="10"  Background="White">
        <DataGrid 
                ItemsSource="{Binding VesselCollection, Mode=OneWay}" 
                AutoGenerateColumns="False" 
                CanUserAddRows="False" 
                CanUserResizeColumns="False" 
                IsReadOnly="True">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Vessel Code" Binding="{Binding VesselCode}" />
                    <DataGridTextColumn Header="Vessel Name" Binding="{Binding VesselName}" />
                </DataGrid.Columns>
        </DataGrid>
    </Border>

</UserControl>

最后是 class,它公开了 VesslName、VesselCode 等属性。

public class ReferentialVesselLineViewModel : ViewModelBase
    {
        private Vessel vessel;

        public ReferentialVesselLineViewModel(Vessel vessel)
        {
            this.vessel = vessel;
        }

        public String VesselName
        {
            get { return vessel.Name; }
            set
            {
                if(vessel.Name != value)
                {
                    vessel.Name = value;
                    RaisePropertyChanged("VesselName");
                }
            }
        }

        public String VesselCode
        {
            get { return vessel.Code; }
            set
            {
                if(vessel.Code != value)
                {
                    vessel.Code = value;
                    RaisePropertyChanged("VesselCode");
                }
            }
        }

        //...etc

    }

如有任何帮助,我们将不胜感激

我找到了解决方案,事实上,我应该在集合填满后立即引发 NotifyPropertyChanged 事件。

    public class ReferentialVesselViewModel : ViewModelBase
        {
            public ReferentialVesselViewModel()
            {
               Task.Factory.StartNew(() =>
                        App.Current.Dispatcher.BeginInvoke(new Action(() =>
                        {

                            VesselEntities = ServiceProxy.Load<VesselProxy, IEnumerable<Vessel>>(proxy => proxy.GetVesselTable());

                            foreach (var vessel in VesselEntities)
                                VesselCollection.Add(new ReferentialVesselLineViewModel(vessel));
 RaisePropertyChanged(() => VesselCollection);
                        })));
            }

                public ObservableCollection<ReferentialVesselLineViewModel> VesselCollection { get; private set; }
            }