Как правильно написать на MVVM? Подскажите, как правильно использовать шаблон MVVM в WPF приложении. Пример классов:
Использование контрола в стороннем классе (Создание из кода):BrowserView someBrowser = new BrowserView();
container.Children.Add(someBrowser);
someBrowser.Navigate("http://google.ru/");
someBrowser.SomeControlText = "Перешёл на сайт google.ru";
View класс:public partial class BrowserView : UserControl
{
BrowserViewModel viewModel;
public BrowserView()
{
InitializeComponent();
viewModel = new BrowserViewModel(this.GetType());
this.DataContext = viewModel;
}

public string SomeControlText
{
get { return viewModel.Model.SomeControlText; }
set { viewModel.Model.SomeControlText = value; }
}

public void Navigate(string newAddress)
{
viewModel.Model.SomeBrowser.Address = newAddress;
}
}
XAML:





ViewModel класс:public class BrowserViewModel : Notifier
{
public BrowserModel Model { get; private set; }
public BrowserViewModel(Type typeControl)
{
Model = new BrowserModel();

ChromiumWebBrowser browser = new ChromiumWebBrowser();
Model.SomeBrowser = browser;
}
}
Model класс:public class BrowserModel : Notifier
{
ChromiumWebBrowser someBrowser;
public ChromiumWebBrowser SomeBrowser
{
get { return someBrowser; }
set { someBrowser = value; OnPropertyChanged("SomeBrowser"); }
}

string someControlText;
public string SomeControlText
{
get { return someControlText; }
set { someControlText = value; OnPropertyChanged("SomeControlText"); }
}
}Есть пара конкретных вопросов:
1) Допустим, я хочу изменить свойство Text у SomeControl.
Это свойство забиндено на Model.SomeControlText.
Как правильно это сделать?
- Есть вариант viewModel сделать публичным и обратитсья вот так:someBrowser.viewModel.Model.SomeControlText = "какой-то текст";
- Есть вариант продублировать это свойство в ViewModel (при этом viewModel так же сделать публичным) и сделать вот так:someBrowser.viewModel.SomeControlText = "какой-то текст";
- Ещё вариант, создать свойство во View и сделать как-то так:public string SomeControlText
{
get { return viewModel.Model.SomeControlText; }
set { viewModel.Model.SomeControlText = value; }
}
Обращаться вот так: someBrowser.SomeControlText = "какой-то текст";
Вопрос, какой из этих вариантов правильный и если никакой, то как это делается?
2) Я хочу изменить свойство Address у объекта ChromiumWebBrowser в ViewModel. Есть такие-же варианты как в прошлом вопросе. А как это делать правильно?
Что я делаю не так? Или все верно?

21 Авг 2019 в 07:07
174 +1
0
Ответы
1

1) Вариант, когда свойство SomeControlText продублировано во ViewModel и установка значения происходит через ViewModel (someBrowser.viewModel.SomeControlText = "какой-то текст"), является более правильным подходом. Такой подход соответствует принципам MVVM, где доступ к данным осуществляется через ViewModel, а не напрямую из View.

2) Для изменения свойства Address у объекта ChromiumWebBrowser в ViewModel, также рекомендуется создать соответствующее свойство в ViewModel и устанавливать его значение через ViewModel. Например:

public string Address
{
get { return Model.SomeBrowser.Address; }
set { Model.SomeBrowser.Address = value; OnPropertyChanged("Address"); }
}

И внутри ViewModel можно устанавливать адрес следующим образом: viewModel.Address = "http://example.com";

В целом, ваш код соответствует принципам MVVM, однако рекомендуется более четко разделять доступ к данным между View и ViewModel, чтобы упростить поддержку и улучшить читаемость кода.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 94 835 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир