MVVM - Получить свойство ViewModel из отдельного класса Command - PullRequest
0 голосов
/ 20 сентября 2018

Заранее спасибо за помощь.

Я впервые разрабатываю в MVVM и хотел бы разделить бизнес-логику модели представления на два класса MyViewViewModel и MyViewCommand .

На самом деле я использую RelayCommand для привязки команд в модели представления.

MyViewCommandHandler:

    /// <summary>
    /// Constructor
    /// </summary>
    public ConfigRefCommandHandler(Action requestClose)
    {
        base.RequestClose += requestClose;
        // Assign all operations to commands
        // Config
        this.CmdSelectAllReferences = new RelayCommand(this.SelectAllReferencesCmd, this.CanExecuteSelectAllReferencesCmd);
        this.CmdModifyDetails = new RelayCommand(this.ModifyDetailsCmd, this.CanExecuteModifyDetailsCmd);
        this.CmdProhibitPlanning = new RelayCommand(this.ProhibitPlannningCmd, this.CanExecuteProhibitPlannningCmd);
        this.CmdExit = new RelayCommand(this.ExitCmd, this.CanExecuteExitCmd);
        // Macro
        this.CmdAddMacro = new RelayCommand(this.AddMacroCmd, this.CanExecuteAddMacroCmd);
        this.CmdModMacro = new RelayCommand(this.ModMacroCmd, this.CanExecuteModMacroCmd);
        this.CmdDelMacro = new RelayCommand(this.DelMacroCmd, this.CanExecuteDelMacroCmd);
        // Program
        this.CmdAddProgram = new RelayCommand(this.AddProgramCmd, this.CanExecuteAddProgramCmd);
        this.CmdModProgram = new RelayCommand(this.ModProgramCmd, this.CanExecuteModProgramCmd);
        this.CmdDelProgram = new RelayCommand(this.DelProgramCmd, this.CanExecuteDelProgramCmd);
    }

MyViewViewModel:

    /// <summary>
    /// Internal reference
    /// </summary>
    public String InternalReference
    {
        get
        {
            return "test";
        }
        set
        {
            base.OnPropertyChanged("InternalReference");
        }
    }

    /// <summary>
    /// Constructor
    /// </summary>
    public ConfigRefViewModel(Action requestClose)
    {
        ConfigRefCommandHandler commandHandler = new ConfigRefCommandHandler(requestClose);

        // Config
        this.CmdSelectAllReferences = commandHandler.CmdSelectAllReferences;
        this.CmdModifyDetails = commandHandler.CmdModifyDetails;
        this.CmdProhibitPlanning = commandHandler.CmdProhibitPlanning;
        this.CmdExit = commandHandler.CmdExit;
        // Macro
        this.CmdAddMacro = commandHandler.CmdAddMacro;
        this.CmdModMacro = commandHandler.CmdModMacro;
        this.CmdDelMacro = commandHandler.CmdDelMacro;
        // Program
        this.CmdAddProgram = commandHandler.CmdAddProgram;
        this.CmdModProgram = commandHandler.CmdModProgram;
        this.CmdDelProgram = commandHandler.CmdDelProgram;
    }

Как передать MyViewViewModel в MyViewCommand , чтобы установить InternalReference свойство для активации метода OnPropertyChanged () для перезагрузки MyView ?

1 Ответ

0 голосов
/ 21 сентября 2018

Наконец, я использовал другой класс для получения всех ViewModel .

Этот класс является Статическим классом, и она использует шаблон Singleton , как вы можете видеть:

/// <summary>
/// View model handler for all ViewModel
/// </summary>
static class ViewModelHandler
{
    #region Properties
    /// <summary>
    /// Config reference ViewModel
    /// </summary>
    private static ConfigRefViewModel ConfigRefViewModel = null;
    #endregion

    #region Getter
    /// <summary>
    /// Get the ConfigRefViewModel property
    /// </summary>
    /// <param name="requestClose">The request for closing view</param>
    /// <returns>The view model of config reference view</returns>
    public static ConfigRefViewModel GetConfigRefViewModel(Action requestClose = null)
    {
        if (ViewModelHandler.ConfigRefViewModel != null) return ViewModelHandler.ConfigRefViewModel;

        ViewModelHandler.SetConfigRefViewModel(new ConfigRefViewModel());
        ViewModelHandler.GetConfigRefViewModel().Initialize(requestClose);

        return ViewModelHandler.ConfigRefViewModel;
    }
    #endregion

    #region Setter
    /// <summary>
    /// Set the ConfigRefViewModel property
    /// </summary>
    /// <param name="configRefViewModel">ConfigRefViewModel to set</param>
    private static void SetConfigRefViewModel(ConfigRefViewModel configRefViewModel) => ViewModelHandler.ConfigRefViewModel = configRefViewModel;
    #endregion
}

Чтобы заставить его работать, я удалил конструктор ConfigRefViewModel и поместил его в метод инициализации, потому что в этом конструкторе Класс ConfigRefCommand является экземпляром.

Это была проблема, поскольку класс ConfigRefCommand нуждается в методе для закрытия представления, а мой ViewModelHandler необходим для создания пустого экземпляра. ConfigRefViewModel в первую очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...