我有一个使用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;
}
}
我使用DataContext属性将WorkDay绑定到WindowsPhonePage。
<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();
但是,我在该页面上有一个按钮切换到另一个WorkDay,我在代码隐藏中使用了以下行(来自按钮事件处理程序)。
new ViewModelLocator().WorkDayViewModel.LoadWorkDay(previousDate);
这实际上应该触发ViewModel中WorkDay的更新,从而在UI上进行更新。我在上面的hte代码中看到了使用RaisePropertyChanged和自定义Set()方法,但页面上仍然没有任何反应。即工作日不会改变。使用调试版我看到了WorkDay肯定会按预期更新。
所以问题是:尽管我在使用数据上下文绑定到UI的视图模型中更改了WorkDay,但为什么UI不会更新。
这是我的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。
答案 0 :(得分:3)
在您的Xaml中使用定位器来获取数据上下文:
DataContext="{Binding ViewModelName, Source={StaticResource Locator}}">
此外,您的viewmodel中应该有一个无参数的ctor。
还有一个: 要在后面的视图代码中获得对视图模型的引用:
var vm = DataContext as ViewModelName;