Как вызвать метод управления пользователем с помощью MVVM? - PullRequest
4 голосов
/ 10 февраля 2010

Я работаю в проекте WPF, я использую скороговорку MVVM в моем проекте.

Я создал пользовательский элемент управления (также в WPF) и хочу использовать его в своем проекте. Теперь моя проблема заключается в том, что в моем пользовательском элементе управления есть метод, который мне нужно вызывать из моей модели представления, но я не не знаю, как это сделать, как привязать метод внутри моего элемента управления из модели представления.

Если я использую код позади, очевидно, что нет никаких проблем, так как у меня есть прямая ссылка на мой элемент управления, поэтому я могу сделать "mycontrol.MyMethod ();" m, но, конечно, выполнение таким образом пойдет против логика паттерна MVVM.

Я попытался использовать свойство зависимости в своем пользовательском элементе управления и использовать это свойство зависимости для привязки к нему в xaml моего проекта, но оно не сработало, компилятор говорит, что свойство не найдено или не сериализуемо .

Поэтому я буду признателен, если кто-нибудь расскажет о том, как мне этого добиться.

1012 * Отредактированный *

Насколько я понимаю, у вас есть представление, которое представляет собой весь GUI, тогда у вас есть модель, которая является всей логикой, и у них есть модель представления, которая похожа на промежуточный слой, используемый для связывания представления с моделью, верно?

Таким образом, я разработал свой проект, однако я столкнулся с проблемой, что мне нужен пользовательский элемент управления, TextBox, который помнит, что пользователь ввел, и когда он начинает печатать, если есть слова, начинающиеся с этой буквы, эти слова показаны в качестве предложения, как это делает Google.

Этот TextBox используется в качестве поискового фильтра; поэтому я создал для этого пользовательский элемент управления и добавил в свой пользовательский элемент метод, позволяющий любому приложению, использующему этот элемент управления, добавлять элементы во внутренний массив, содержащий все строки, введенные пользователем.

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

Так что моя проблема в том, когда я добавляю свой пользовательский элемент управления в основной проект, потому что мне нужно каким-то образом иметь возможность вызывать метод, который добавляет элементы во внутренний массив, но, возможно, я делаю вещи неправильно, поэтому если у кого-то из вас есть идея получше, я буду признателен, если вы поделитесь ею со мной.

Ответы [ 3 ]

1 голос
/ 13 декабря 2010

Вы никогда не должны вызывать методы View из ViewModel и наоборот.

Создайте свойство (ObservableCollection?) В вашей ViewModel, у него будет событие CollectionChanged, подпишитесь на него, чтобы отслеживать изменения (при необходимости).

Когда вы добавляете элемент в коллекцию в вашей ViewModel, графический интерфейс будет обновляться соответствующим образом (вы должны выполнить операцию Add () в потоке GUI, кстати).

Если вам нужно изменить текущую позицию в вашем списке, для этого есть выборки (CollectionViewSource и т. Д.).

Если вам действительно нужно передать строку в ваш элемент управления, создайте свойство DependencyProperty и привяжите его OneWay к свойству ViewModel. Когда вы устанавливаете значение, оно будет вызывать PropertyChangedCallback для вашего DependencyProperty.

0 голосов
/ 10 февраля 2010

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

Почему бы просто не сделать этот массив свойством зависимости (и, кроме того, IEnumerable<string> или ObservableCollection<string>)? Затем вы можете просто создать соответствующее свойство в вашей модели представления и связать его с элементом управления. Это также делает управление значительно более универсальным.

0 голосов
/ 10 февраля 2010

Вы не должны вызывать что-либо в View из ViewModel, так как это нарушает модель.

Если причина, по которой вы хотите вызвать метод в пользовательском элементе управления, связана только с пользовательским интерфейсом, я не вижу ничего плохого в том, чтобы делать это из представления - cs представления и xaml представления находятся в одном и том же "пространстве". "в модели. Вы можете быть чрезмерно чистыми в желании иметь скудный и средний просмотр файлов CS.

...