У меня проблема с реализацией MVVM с помощью usercontrols.
У меня есть приложение на основе MVVM.
В одном из представлений (которое является пользовательским элементом управления) у меня есть меню слева и содержимое справа. Содержание меняется в зависимости от меню. Я пытался реализовать MVVM с помощью пользовательского элемента управления, но не знаю, как это сделать.
Вот что я пробовал, но это не сработало:
<UserControl x:Class = "PoS.Views.OptionsView"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:local = "clr-namespace:PoS.Views"
mc:Ignorable = "d"
d:DesignHeight = "450" d:DesignWidth = "800">
<UserControl.Resources>
<DataTemplate x:Name = "SettingsTemplate" DataType = "{x:Type viewmodels:SettingsViewModel}">
<views:SettingsView DataContext = "{Binding}" />
</DataTemplate>
</UserControl.Resources>
<Grid>
</Grid>
</UserControl>





Честно говоря, я думаю, вам нужно немного отмотать назад и прочитать хорошую книгу о MVVM, прежде чем продолжить. Pro WPF and Silverlight MVVM Гэри Маклина Холла — хорошее место для начала.
Чтобы ответить на ваш вопрос, я предполагаю, что этот пользовательский элемент управления настроен так, что его DataContext указывает на ваш MainViewModel. Содержимому справа требуется соответствующее свойство в модели основного представления, например, что-то вроде этого:
private ViewModelBase _CurrentPage;
public ViewModelBase CurrentPage
{
get { return this._CurrentPage; }
set
{
if (this._CurrentPage != value)
{
this._CurrentPage = value;
RaisePropertyChanged(() => this.CurrentPage);
}
}
}
Затем вы создаете кучу «страниц» или что-то, что наследует ViewModelBase, то есть Page1ViewModel, Page2ViewModel, SettingsViewModel и т. д. Затем вы создаете ContentControl и привязываете его содержимое к этому свойству:
<ContentControl Content = "{Binding CurrentPage}" />
Итак, теперь, если ваша модель представления делает что-то вроде CurrentPage = new SettingsViewModel(), тогда ContentControl будет заполнена тем, что вы объявили как DataTemplate для этого типа (т.е. элементом управления типа views:SettingsView). Если вы присвоите свойство чему-то другому, то SettingsView будет уничтожен и заменен любым DataTemplate для нового типа.
В приведенном выше примере будут работать только SettingsViewModel/SettingsView, потому что это все, для чего вы создали DataTemplate; чтобы это работало, вам нужно создать отдельный DataTemplate для каждого типа пары ViewModel/View, которую вы создаете.
Честно? Потому что это тот, у которого я изначально учился, и я нашел его очень поучительным в то время. Конечно, это было где-то 7 или 8 лет назад, о чем свидетельствует тот факт, что в его названии есть «Silverlight», так что, возможно, сейчас есть много гораздо лучших вариантов. Я также обнаружил, что «Advanced MVVM» Джоша Смита стоит прочитать и содержит несколько хороших практических советов, хотя и немного кратких.
Меня интересует рекомендованная вами книга «Pro WPF и Silverlight MVVM», но отзывы о ней на Amazon невелики. Если вы не возражаете, я хотел бы знать, почему вы считаете, что это хорошая книга.