Как правильно написать на 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; } }
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. Есть такие-же варианты как в прошлом вопросе. А как это делать правильно? Что я делаю не так? Или все верно?
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, чтобы упростить поддержку и улучшить читаемость кода.
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, чтобы упростить поддержку и улучшить читаемость кода.