视图模型库中的单个对象未在UI中更新
本文关键字:UI 更新 单个 模型库 视图 对象 | 更新日期: 2023-09-27 18:15:50
我有一个使用来自MVVMLight框架的ViewModelBase的视图模型。如下
public class WorkDayViewModel : ViewModelBase
{
private IWorkDayServiceAgent _workDayServiceAgent;
private WorkDay _workDay;
public WorkDay WorkDay
{
get { return _workDay; }
set
{
//_workDay = value;
//RaisePropertyChanged();
Set(() => WorkDay, ref _workDay, value);
}
}
public WorkDayViewModel(IWorkDayServiceAgent workDayServiceAgent)
{
_workDayServiceAgent = workDayServiceAgent;
}
public async void LoadWorkDay(Date date)
{
WorkDay = await _workDayServiceAgent.GetWorkDay(date);
}
public void LoadWorkDay(WorkDay workDay)
{
_workDay = workDay;
}
}
我有一个工作日绑定到一个WindowsPhonePage使用DataContext属性。
<phone:PhoneApplicationPage
...>
<phone:PhoneApplicationPage.DataContext>
<viewModel:WorkDayViewModel></viewModel:WorkDayViewModel>
</phone:PhoneApplicationPage.DataContext>
...
<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot">
...
<!-- current total -->
<TextBlock
Text="{Binding Path=WorkDay.Duration}"
</TextBlock>
...
</Grid>
...
</Grid>
</phone:PhoneApplicationPage>
在代码背后的OnNavigatedTo方法中,我将数据上下文设置为显示对话框时的第一项。
workDayViewModel.WorkDay = (WorkDay) NavigationObjectCache.Get();
但是,我在该页上有一个按钮,可以切换到另一个工作日,我使用下面的代码(从按钮事件处理程序中)。
new ViewModelLocator().WorkDayViewModel.LoadWorkDay(previousDate);
这实际上会触发ViewModel中对WorkDay的更新,从而对UI进行更新。我使用了RaisePropertyChanged和自定义Set()方法,正如您在上面的代码中看到的那样,但页面上仍然没有发生任何事情。也就是说,工作日不会改变。通过调试,我看到WorkDay确实按照预期进行了更新。
所以问题是:为什么UI没有更新,尽管我在视图模型中更改了使用数据上下文绑定到UI的WorkDay。
这是我的ViewModelLocator。我使用一个静态构造函数,所以每个视图模型只注册一次。public class ViewModelLocator
{
public WorkDayViewModel WorkDayViewModel
{
get { return SimpleIoc.Default.GetInstance<WorkDayViewModel>(); }
}
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
// services
SimpleIoc.Default.Register<IWorkDayServiceAgent, MockWorkDayServiceAgent>();
// view models
SimpleIoc.Default.Register<WorkDayViewModel>();
}
}
请注意我使用的是MVVMLight
在Xaml中使用定位器获取数据上下文:
DataContext="{Binding ViewModelName, Source={StaticResource Locator}}">
同时,你应该在你的视图模型中有一个无参数的元素。
还有一个:要在视图代码中获得对视图模型的引用:
var vm = DataContext as ViewModelName;