视图模型库中的单个对象未在UI中更新

时间:2014-07-31 22:46:05

标签: c# windows-phone-8 mvvm-light

我有一个使用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。

1 个答案:

答案 0 :(得分:3)

在您的Xaml中使用定位器来获取数据上下文:

DataContext="{Binding ViewModelName, Source={StaticResource Locator}}">

此外,您的viewmodel中应该有一个无参数的ctor。

还有一个: 要在后面的视图代码中获得对视图模型的引用:

var vm = DataContext as ViewModelName;