Динамическая генерация ViewModel для всплывающих подсказок в WPF MVVM - PullRequest
2 голосов
/ 25 января 2012

У меня есть список элементов, представляющих пакеты в элементе управления MVVM.

Когда вы наводите курсор на всплывающую подсказку, ей нужно перейти в базу данных для получения дополнительной информации, просто для простоты назовем ее «PackageDetails».Я знаю, как справиться с загрузкой базы данных с помощью класса ViewModel, но у меня возникают проблемы с выяснением, когда его создавать.

Подход 1) Имейте свойство 'lazy-load' в объекте 'Package', поэтому когдавсплывающая подсказка, модель представления будет создана и сразу же получит доступ к базе данных.Этот подход не идеален, потому что каждый объект 'Package' не является истинной моделью представления и изначально исходил из объектов WCF.

Подход 2) Используйте конвертер, как описано в этой записи блога Джоша Смита .Его пример, кажется, хорошо подходит для преобразователя, но я не думаю, что он действительно подходит для моей ситуации.

Подход 3) Каким-то образом создайте модель представления в XAML, но это кажется плохой идеей.

Какой хороший подход для динамической генерации модели представления для всплывающей подсказки с использованием MVVM?

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Привязка моделей (в вашем случае пакетов) к представлению работает только для очень простых ситуаций, когда больше нет «обработки» или бизнес-логики для реализации.

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

Другой вариант, с которым я экспериментировал, - это использование частичных классов для расширения моделей wcf. Это работает, если вы не используете dataannotations для проверки (wcf и dataannotations неправильно работают вместе)

если вы решите обернуть свои модели с помощью vm, то создание экземпляра списка упаковщиков виртуальных машин - это всего лишь одна строка кода с использованием linq и lambdas

при условии, что на вашей виртуальной машине есть конструктор, который принимает вашу модель в качестве параметра.

var listPackageVMs = new ObservableCollection<PackageVM> ( listPackageModels.Select(model=> new PackageVM(model)));
1 голос
/ 10 февраля 2012

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

namespace WCFServiceNamespace
{
    // Since WCF generated entities are partial classes, we can inject features
    public partial class Package
    {
        private readonly IDataAccessor _DataAccessor;

        public Package()
            : this(DataAccessor.Instance) // how you choose to inject a data accessor is up to you
        {
        }

        public Package(IDataAccessor dataAccessor)
        {
            _DataAccessor = dataAccessor;
            _ToolTip = new Lazy<string>(GetToolTip);
        }

        private readonly Lazy<string> _ToolTip;
        public string ToolTip
        {
            get
            {
                // executes GetToolTip when the Value property of Lazy<T> is accessed
                return _ToolTip.Value;
            }
        }

        private string GetToolTip()
        {
            // we're assuming we can retreive the tooltip by ID, and that PackageId is defined in the generated WCF entity
            return _DataAccessor.GetToolTipByPackageId(PackageId);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...