2010-02-10 2 views
4

Я работаю в проекте WPF, я использую MVVM patter в моем проекте.Как вызвать метод управления пользователями с помощью MVVM?

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

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

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

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

Edited

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

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

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

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

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

ответ

0

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

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

+0

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

+0

@Vic: это звучит как проблема с INotifyPropertyChanged или что-то подобное. Это базовое обязательное уведомление. Предложение Роберта должно сработать ... вам просто придется немного подкопать привязку. Эта статья поможет вам отлаживать привязки: http://bea.stollnitz.com/blog/?p=52 –

+0

Я нашел два способа решить эту проблему, первый из которых заключался в том, чтобы сделать мое целевое свойство зависимым, и, следовательно, Класс View-Model будет иметь подкласс из DependencyObject. Другой способ состоял в том, чтобы иметь свойство target как общее свойство, но в наборе {} вам нужно добавить строку «base.RaisePropertyChanged (« your_property_name »); и класс View-Model будет иметь подкласс из ObservableObject. Большое спасибо, потому что без ваших комментариев я бы этого не сделал. – Vic

0

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

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

+0

Хорошо, я сказал, что хочу вызвать метод из ViewModel, потому что он близок к представлению, но вы правы, следуя логике модели, я должен вызвать метод из модели, однако проблема все еще остается, как вы это сделаете, чтобы вызвать метод внутри пользовательского элемента управления из модели? метод, который мне нужно использовать для добавления элементов во внутренний массив в пользовательском элементе управления ... – Vic

+0

@Vic Я думаю, что вы пошли другим путем с предложением Amaca. Когда Amaca сказал «Модель», он/она говорил * шаблон MVVM *. Вы никогда не должны * всегда ссылаться непосредственно на представление из модели. Возможно, вы можете отредактировать свой ответ с более подробной информацией о своем сценарии, и кто-то может что-то предложить вам. Вероятно, вы создали элемент управления, когда вам не нужно (создание фактического элемента управления должно быть довольно редким), и мы можем помочь вам разобраться в этом чуть больше –

+0

спасибо, я добавил больше информации на мой вопрос, надеюсь, что это поможет. – Vic

1

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

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

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

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

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

Смежные вопросы