MVVM: предоставление каждой модульной части своего собственного класса XAML - PullRequest
0 голосов
/ 20 февраля 2011

Я думал о том, чтобы сделать это, а не определять множество DataTemplates. Это означало бы, что если бы у меня была коллекция вещей, у самого ItemsControl был бы класс XAML, и у объектов тоже был бы один.

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

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

Минусы: больше классов XAML.

Не могли бы вы рассказать мне об этом или об этом?

Пример

У меня есть кнопки по всему приложению, поэтому я определяю ButtonViewModel, которая имеет отображаемое имя и свойство ICommand. Для этого объекта я бы также определил DataTemplate или UserControl, который в основном представлял бы собой кнопку с привязкой команд и привязкой текста / содержимого к отображаемому имени. Я мог бы также определить его внешний вид и тому подобное.

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

public class ButtonViewModel : ViewModelBase
{
    private string _displayName;
    public string DisplayName
    {
        get
        { 
            return _displayName;
        }
        set
        {
            _displayName = value;
            RaisePropertyChanged("DisplayName");
        }
    }

    private ICommand _command;
    public ICommand command
    {
        get
        {
            return _command;
        }
        protected set
        {
            _command = value;
            RaisePropertyChanged("Command");
        }
    }

    public ButtonViewModel(ICommand command, string displayName)
    {
        Command = command;
        DisplayName = displayName;
    }

}

ViewModel с использованием ButtonViewModel

public class SomeViewModel : ViewModelBase
{
    //some functionality

    //It could be done as a collection or just seperate ButtonViewModel properties
    public ObservableCollection<ButtonViewModel> Buttons { get; set; }

    //Somewhere where it makes sense, here in the constructer for the heck of it
    public SomeViewModel()
    {
        Buttons.Add(new ButtonViewModel(new RelayCommand(Save, canSave), "Save"));
        Buttons.Add(new ButtonViewModel(new RelayCommand(Edit, canEdit), "Edit"));
        Buttons.Add(new ButtonViewModel(new RelayCommand(New, canAddNew), "New"));
    }
}

Вид кнопок:

<UserControl x:Class="WpfApplication1.ButtonView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="60" Width="90">
    <Button Command="{Binding Path=Command}" Content="{Binding Path=DisplayName}">
        <!-- Some really cool design for your button -->

    </Button>
</UserControl>

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

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

1 Ответ

0 голосов
/ 20 февраля 2011

Я не совсем уверен в том, что вы спрашиваете, но звучит так, как будто вы выбираете подход, основанный на просмотре, который может быть очень сложным во всем, кроме самых простых приложений. Рассматривали ли вы использование инфраструктуры MVVM, такой как Caliburn.Micro ?

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...