MVVM Light和同一ViewModel的多个实例,不更新UI

时间:2014-10-14 10:57:24

标签: c# wpf mvvm-light

现在使用MVVM Light已经有一段时间了,所以我确实有一点经验,但我从来没有尝试过做同一个viewmodel的多个实例

基本上,我创建了一个usercontrol,它有一个viewmodel,我在WPF窗口中使用了这个控件的4个实例。

以下是我在xaml中进行绑定的方法,非常简单。

<UserControl.DataContext>
   <Binding Path="PodView" Source="{StaticResource Locator}"/>
</UserControl.DataContext>

<TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" VerticalAlignment="Top" Margin="6,0,0,0" Text="{Binding PodModel}"/>

这是服务定位器代码。

public class ViewModelLocator
{
    /// <summary>
    /// Initializes a new instance of the ViewModelLocator class.
    /// </summary>
    public ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        SimpleIoc.Default.Register<MainViewModel>();
        SimpleIoc.Default.Register<PODViewModel>();
    }

    public MainViewModel Main
    {
        get
        {
            return ServiceLocator.Current.GetInstance<MainViewModel>();
        }
    }

    public PODViewModel PodView
    {
        get
        {
            //return ServiceLocator.Current.GetInstance<PODViewModel>(Guid.NewGuid().ToString());
            return new PODViewModel();
        }
    }

    public static void Cleanup()
    {
        // TODO Clear the ViewModels
    }
}

正如您所看到的,我已经尝试了几种方法来返回视图模型的实例,但我不认为问题就在那里。

好的,现在问题。在viewmodel我有一个这样的属性绑定到文本框

private string _PodModel;
public string PodModel
{
    get { return _PodModel; }
    set
    {
        if (_PodModel != value)
        {
            _PodModel = value;
             RaisePropertyChanged(() => PodModel);
        }
    }
}

现在在构造函数中我有这个工作正常,我在混合和程序运行时验证了这一点。

public PODViewModel()
{
    if (IsInDesignMode)
    {
        ////    // Code runs in Blend --> create design time data.                
        PodModel = "HSA3";    // <-- This works fine
    }
    else
    {
        ////    // Code runs "for real"                
        PodModel = "Fred";    // <-- This works fine
    }
}

现在问题是每个控件都有一个执行长任务的线程,它会更改PodModel属性。这样做时我没有任何例外,但UI没有更新。

PodModel = "blah blah blah";

所以我将代码移动到UI线程上,但UI仍然无法更新。

DispatcherHelper.CheckBeginInvokeOnUI(() =>
   {
       PodModel = "blah blah blah";
   });

我在该物业上设置了一个断点&#39; set&#39;我可以看到该物业确实发生了变化。

任何想法为什么UI不会更新?

更新1:我注意到有2次调用来获取PodViewModel

的实例

1 个答案:

答案 0 :(得分:2)

我认为问题是 PodView 属性总是返回一个新对象。它导致更新视图模型的不同实例的情况(例如,通过将 PodModel 属性设置为“blah blah blah”)而不是UI绑定到。它无法工作,因为UI不知道他的视图模型实例已更新。要确认这一点,请尝试使用以下代码:

private PODViewModel  _podView = new PODViewModel();  
public PODViewModel PodView
{
    get
    {
        return _podView ;
    }
}