MVVM WPF, связанный с дизайном запрос: использование UserControls - PullRequest
1 голос
/ 10 августа 2010

У меня есть один запрос, связанный с проектированием WPF с использованием MVVM

Вот сценарий:

1> У меня есть один экран WPF, который содержит различные пользовательские элементы управления, которые также можно использовать на некоторых других экранах.

2> Могу ли я иметь отдельный класс ViewModel для каждого из этих пользовательских элементов управления, что может быть идеальным дизайном в этом сценарии

3> Должен ли я отделить свою Viewmodel на основе отдельного экрана или пользовательских элементов управления.

4> Если я создаю отдельные view-модели на основе UserControls, как мне их интегрировать.

Есть ли какие-либо руководящие указания по проектированию вокруг этого !!

Срочная помощь приветствуется ..

Ответы [ 2 ]

0 голосов
/ 10 августа 2010

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

Инфраструктура будет чем:

Общееviewmodel для вашего экрана WPF, который содержит экземпляры viewmodels для ваших пользовательских контролей.Это DataContext экрана будет общей моделью представления. DataContext пользовательских элементов управления будет Binding с PropertyPath модели представления пользовательского элемента управления в вашей общей модели представления.Например:

На экране WPF:

<ListBox  DataContext="{Binding}" ItemsSource="{Binding Path=ItemList}">
    <ListBox.ItemTemplate>
         <yourControls:YourUserControl />
    </ListBox.ItemTemplate>
</ListBox>

В общей модели представления:

public class ScreenViewModel : INotifyPropertyChanged
{
    private ObservableCollection<YourUserControlViewModel> _itemList = 
        new ObservableCollection<YourUserControlViewModel>();

    public ObservableCollection<YourUserControlViewModel> ItemList
    {
        get { return _itemList; }
        set { _itemList = value; }
    }
}

Это автоматически сгенерирует пользовательский элемент управления для каждой модели представления в ItemListВаша модель общего вида.

0 голосов
/ 10 августа 2010

В этом посте описывается, что я делаю в определенном сценарии, я не знаю, является ли это наилучшей практикой или нет, но она работает для меня.

Я создаю ViewModel для своего окна, которое содержит все пользовательские элементы управления, так что это называется ContainerViewModel, и я создаю экземпляр этой Viewmodel и помещаю его в DataContext окна.С этого момента все UserControls могут получить доступ к этой ViewModel с помощью Binding.Следующее, что нужно сделать, это создать свойство в моем ContainerViewModel для вечного UserControl, которое содержит ViewModel для каждого UserControl.Затем используйте привязку, чтобы присоединить usercontrols ViewModel к свойству DataContext Usercontrol.

пример viewmodels и окна с 2 списками вместо usercontrols: классы Viewmodel без какой-либо реализации, но просто пустые классы, чтобы показать концепцию:

public class ContainerViewModel
{
    public ContainerViewModel()
    {
        ViewModelForControl1 = new Control1ViewModel();
        ViewModelForControl2 = new Control2ViewModel();
    }

    public Control1ViewModel ViewModelForControl1 { get; set; }
    public Control2ViewModel ViewModelForControl2 { get; set; }
}
public class Control1ViewModel { }
public class Control2ViewModel { }

Окно xaml:

<Window x:Class="ConfigHellp.UI.Windows.ContainerWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:vm="clr-namespace:ConfigHellp.UI.ViewModel"
        mc:Ignorable="d"
        DataContext="{DynamicResource ContainerViewModel}"  >
    <Window.Resources>
        <vm:ContainerViewModel x:Key="ContainerViewModel" d:IsDataSource="True" />
    </Window.Resources>
    <StackPanel>

        <ListBox DataContext="{Binding ViewModelForControl1}" />
        <ListBox DataContext="{Binding ViewModelForControl2}" />
    </StackPanel>
</Window>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...