Удаление кода UserControl для использования с MVVM

Я пытаюсь создать пользовательский элемент управления с помощью MVVM. В основном я пытаюсь обернуть поле со списком, которое будет извлекать данные из репозитория. Это позволит мне использовать одно и то же поле со списком во многих разных представлениях в моем приложении. В приложении будет много обернутых выпадающих списков.

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

Любые идеи или предложения будут высоко оценены на этом этапе.

Спасибо, Эрик


person Eric Gurney    schedule 17.01.2014    source источник
comment
Вполне допустимо использовать UserControl, в котором есть код, при использовании MVVM. Если вы действительно хотите вывести функциональность из-под контроля, переместите ее в родительские модели представления, где она будет использоваться. Вы можете инкапсулировать его в класс, который можно использовать повторно, если вас это беспокоит.   -  person Sheridan    schedule 17.01.2014
comment
Спасибо. Я думаю, что это тот путь, по которому я собираюсь пойти.   -  person Eric Gurney    schedule 17.01.2014
comment
В этом случае я добавил свой немного расширенный комментарий в качестве ответа, так что этот вопрос может иметь принятый ответ как есть принято на этом сайте.   -  person Sheridan    schedule 18.01.2014


Ответы (3)


Вполне допустимо использовать UserControl, в котором есть код, при использовании MVVM. Если вы действительно хотите переместить функциональность из UserControl, переместите ее в любую модель родительского представления, которая потребуется. Если вы не хотите, чтобы один и тот же код повторялся в нескольких местах, вы можете инкапсулировать его в класс и добавить экземпляр этого класса в качестве свойства к каждой из соответствующих моделей представления.

person Sheridan    schedule 17.01.2014

если у вас есть модель представления, которая будет извлекать данные из репозитория, вы можете использовать одну и ту же модель представления во многих разных моделях представления в своем приложении :)

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

 <DataTemplate DataType="{x:Type local:MyPullDataViewmodel}">
   <view:MyCoolPullDataShowComboboxUserControl />
 </DataTemplate>
person blindmeis    schedule 17.01.2014

Это довольно легко.

Допустим, у вас есть:

MyUserControlView.xaml

MYUserControlViewModel.cs

MyMainWindowView.xaml — для вашего представления MainWindow (того, которое содержит UserControl)

MyMainWindowViewModel.cs — ваша модель представления MainWindow.

И вы хотите связать List<string> MyListToBind И оставить программный код полностью пустым.

MyUserControlViewModel.cs

public class MyUserControlViewModel
{
private List<string> _MyListToBind;
public List<string> MyListToBind { get; set;}
}

MyMainWindowViewModel.cs

public class MyUserControlViewModel
{
private MyUserControlViewModel _MyControlViewModel;
public MyUserControlViewModel MyControlViewModel { get; set;}
}

MyMainWindowView.xaml

<Window ...
xmlns:my="clr-namespace:NamespaceContainingYourUserControlView>
<my:MyUserControlView DataContext = "{Binding Path= MyControlViewModel}"/>
</Window>

MyUserControlView.xaml

<UserControl ...>
<DataGrid ItemsSource = "{Binding Path= MyListToBind}" .../>
...
</DataGrid>
</UserControl>
  • Это не поддерживает ViewModel, обновляющий View. Для этого вам нужно использовать либо DependencyProperties, как вы делали, вместо обычных переменных (как я), либо использовать INotifyPropertyChanged (погуглите, вы получите массу примеров) и событие OnPropertyChanged.
  • Вы можете прочитать DataTemplates, они действительно полезны при привязке данных.

Вы можете найти это полезным:

http://www.youtube.com/watch?v=BClf7GZR0DQ

Я уверен, черт возьми! Удачи.

person michal.ciurus    schedule 17.01.2014
comment
Я понимаю, как работает INotifyPropertyChanged, и я вижу, как я могу связать данные из MainViewModel с UserControlViewModel, но я не могу понять, как связать свойство из MainViewModel со свойством дочернего элемента управления (сетка данных в вашем примере ) из UserControlView. Я специально пытаюсь связать ключ списка элементов в поле со списком с правильным свойством в MainViewModel. - person Eric Gurney; 17.01.2014