WPF MVVM Commands: несколько командных параметров - PullRequest
3 голосов
/ 20 марта 2011

Возможно, моя проблема скорее архитектурная, чем функциональная, но я пытаюсь привязать TextBox к команде, и в этой команде я хотел бы передать несколько параметров (то есть пользовательский объект). Не уверен, как это сделать декларативно (xaml).

ViewA (находится поверх ViewModelA) он имеет TextBox, который связан с CommandX

ViewB (находится поверх ViewModelB) (это фактически другой пользовательский элемент управления в том же окне, что и ViewA) Когда запускается commandX, ViewModelB должен выполнить какой-то метод. ViewModelB необходимо обновить с несколькими свойствами, прежде чем он сможет выполнить этот метод.

У меня вопрос, как мне структурировать мою команду / архитектуру, чтобы ViewModelB имел достаточно информации для выполнения своего метода.

примечание: ViewModelA имеет всю необходимую информацию, чтобы ViewModelB выполнил свой метод. но я не хочу получать его оттуда, потому что позже я бы хотел, чтобы CommandX выполнялся из разных представлений

обновление

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

удивительный

это сработало! вот как выглядит мое свойство parmeter на ViewA

    public ExecuteQueryCommandParameters ExecuteQueryParameters {
        get {
            var p = new ExecuteQueryCommandParameters();
            p.AllColumns = ColumnsMaster;
            p.DatabaseName = SelectedDatabase;
            p.ServerName = SelectedServer;
            p.TopRows = 20;
            p.ViewModelName = "MainDataView";

            return p;
        }
    }

и кнопка реализации

<Button Command="{Binding ExecuteQuery}" CommandParameter="{Binding ExecuteQueryParameters}">Top 20</Button>

обновление

с этим решением есть небольшая дорожная преграда. Параметр команды привязан к свойству. но он извлекает его во время загрузки, а не во время выполнения команды. Мне нужно, чтобы это происходило во время выполнения команды, чтобы все свойства имели последние значения. есть идеи как этого добиться?

1 Ответ

1 голос
/ 20 марта 2011

Вот как я бы это сделал:

Для этого объяснения я предполагаю, что вся необходимая информация находится в одном классе, называемом «MyCustomCommandParameters».

Я также предполагаю,что ваш XAML устанавливает привязку данных основного родительского элемента управления к ViewModelA.

Пусть ViewModelA предоставляет свойство типа MyCustomCommandParameters.

Затем в ViewB создайте свойство DependencyProperty типа MyCustomCommandParameters.Обработчики для этого свойства передают эту информацию ViewModelB.

В XAML свяжите значение ViewB «MyCustomCommandParameters» со свойством ViewModelA «MyCustomCommandParameters».

Это немного одноразовая сантехническая работа, но тогда вы достигнете своей цели - передать информацию из ViewModelA в ViewModelB посредством привязки XAML, и две модели не будут знать друг о друге.

...