Как правильно написать на 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
203 +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 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир