现在使用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
答案 0 :(得分:2)
我认为问题是 PodView 属性总是返回一个新对象。它导致更新视图模型的不同实例的情况(例如,通过将 PodModel 属性设置为“blah blah blah”)而不是UI绑定到。它无法工作,因为UI不知道他的视图模型实例已更新。要确认这一点,请尝试使用以下代码:
private PODViewModel _podView = new PODViewModel();
public PODViewModel PodView
{
get
{
return _podView ;
}
}