视图模型库中的单个对象未在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

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

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

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

同时,你应该在你的视图模型中有一个无参数的元素。

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

var vm = DataContext as ViewModelName;