Использование шаблона данных и передача модели представления из бэкэнда - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть приложение WPF. Я разделил его на два проекта в Visual Studio - WPF. Net Базовый проект "Frontend" и. Net Базовый консольный проект "Backend".

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

В настоящее время у меня есть ItemsControl, который я хочу заполнить объектами "Страна". Я хочу, чтобы каждый элемент в элементе управления отображал несколько значений о стране и имел пару кнопок, привязанных привязками данных к RelayCommands (это класс, который реализует ICommand).

One way I Здесь, в StackOverflow, мы должны были использовать DataTemplate для ItemsControl и установить для него CountryView (пользовательский элемент управления, который я создал в соответствии с шаблоном MVVM), как в "CountryListView":

<ItemsControl ItemsSource="{Binding CountrySet}">
    <ItemsControl.ItemTemplate>
    <DataTemplate>
        <StackPanel>
            <views:CountryView/>
        </StackPanel>
    </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Проблема в том, что для привязки коллекции мне нужно получить ее из базы данных. Что является заданием "Backend". Тем не менее, поскольку внешний интерфейс ссылается на внутренний интерфейс, я не могу заставить внутренний интерфейс заполнять набор объектов «CountryViewModel», так как это создаст циклическую зависимость. Поэтому я импровизировал и создал класс «Country» в проекте «Backend» и сказал, что задача, которая получает информацию из базы данных, заполняет HashSet объектов «Country», которые затем фронт использует и присваивает CountrySet свойство модели представления для «CountryListView».

У меня есть две проблемы с этим подходом:

  1. Объект "Страна" не может иметь свойства RelayCommand, так как это будет опять-таки круговая зависимость.
  2. "CountryViewModel" в данный момент не используется, и наличие метода, который просто преобразует объекты "Country" в объекты "CountryViewModel", похоже на то, что я копаю себя еще глубже в яму, я полагаю, что я я сейчас нахожусь.

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

1 Ответ

0 голосов
/ 09 февраля 2020

Добро пожаловать на SO.

Этот вопрос задают здесь постоянно, хотя и по-разному. Вообще говоря, вы делаете правильные вещи в разделении Country от CountryViewModel. MVVM означает Model-View-ViewModel ... так что в вашем случае Country - это модель, CountryViewModel - это модель вида, а CountryView - это вид. Страна принадлежит вашему «бэкэнду», остальные два принадлежат вашему внешнему интерфейсу.

Если вы дадите свои методы получения и установки класса Country, то вы можете использовать их в связывании, поэтому ваша модель представления может быть чем-то вроде просто, как это:

public class CountryViewModel
{
    public Country Model {get; set;}
}

Тогда вы можете просто связать свой интерфейс напрямую, например:

<TextBlock Text="{Binding Model.Name}" />

Многие люди, кажется, предполагают, что им нужен INP C, когда на самом деле нет, но если вы это сделаете, вы можете выделить отдельные поля следующим образом:

public class CountryViewModel : ViewModelBase
{
    public Country Model {get; set;}

    public string Name
    {
        get => this.Model.Name;
        set
        {
            if (value != this.Model.Name)
            {
                this.Model.Name = value;
                RaisePropertyChanged(() => this.Name);
            }
        }
    }
}

А затем есть другие варианты, такие как добавление поддержки INP C к вашей модели в шаг постобработки или использование чего-то вроде Castle Dynami c Proxy для внедрения поведения во время выполнения .

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

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