Как написать вложенный класс, который связывается с классом ViewModel? - PullRequest
2 голосов
/ 30 сентября 2019

У меня есть страница, на которой должно быть несколько моделей просмотра. Я решил попробовать Вложенные классы. Я использую MVVM Light для своего проекта.

Я написал виртуальную машину, которая наследуется от ViewModelBase и вложенного класса.

Я использовал пример документации Microsoft (вложенный пример):

    public class UserMainViewModel : ViewModelBase
    {
        public UserMainViewModel()
        {

        }

        private Page _mainContent;

        public Page MainContent
        {
            get => _mainContent;
            private set => Set(ref _mainContent, value);
        }   

        public UserVM UserManager
        {
            get
            {
                return new UserVM(new UserMainViewModel());
            }
        }

        public class UserVM
        {
            private UserMainViewModel _viewModel;

            public UserVM(UserMainViewModel viewModel)
            {
                _viewModel = viewModel;
            }

            private RelayCommand _getInfoPageCommand;
            public RelayCommand GetInfoPageCommand
            {
                get
                {
                    return _getInfoPageCommand
                        ?? (_getInfoPageCommand = new RelayCommand(() =>
                        {
                            _viewModel.MainContent = new GetUserInfo();
                        }));
                }
            }
        }
    }

My ViewLocator:

     public ViewModelLocator()
        {
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
            SimpleIoc.Default.Register<UserMainViewModel>();
        }

    public UserMainViewModel UserMainContext => ServiceLocator.Current.GetInstance<UserMainViewModel>();

Просмотр контекста

    DataContext="{Binding UserMainContext, Source={StaticResource Locator}}"

Просмотр элемента, например

    <Button Content="Profile" Command="{Binding UserManager.GetInfoPageCommand}"/>

Но он не работает, когда я нажимаю кнопку. Ничего не происходит.

Правильно ли я понимаю, используя вложенные классы? Кто-нибудь может сказать мне, почему это не работает?

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Вы должны создать один UserVM и передать ему текущий экземпляр UserMainViewModel вместо создания нового каждый раз, когда вызывается свойство:

private UserVM _userVm;
public UserVM UserManager
{
    get
    {
        if (_userVm == null)
            _userVm = new UserVM(this);
        return _userVm;
    }
}
0 голосов
/ 30 сентября 2019

Ваш UserVM также должен унаследовать от ViewModelBase.

public class UserVM : ViewModelBase

Короче говоря ViewModelBase имеет все Уведомления сантехника, запеченные в нем, без него у RelayCommand нет возможности узнать, что его уведомили / назвали

...