WPF usercontrol mvvm
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF usercontrol mvvm相关的知识,希望对你有一定的参考价值。
我在使用usercontrols实现MVVM时遇到问题。
我有一个基于MVVM的应用程序。
在其中一个视图(用户控件)中,左边是菜单,右边是内容。内容根据菜单而变化。我尝试使用usercontrol实现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的好书。 Gary McLean Hall的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;为了使其工作,您需要为您创建的每个ViewModel / View对类型创建单独的DataTemplate。
以上是关于WPF usercontrol mvvm的主要内容,如果未能解决你的问题,请参考以下文章
关于在MVVM架构下WPF中UserControl的 visibility Binding问题。 UserControl MVVM
如何在 MVVM 中的 UserControl 之间进行通信 - WPF 应用程序
在 UserControl WPF MVVM caliburn 内的 UserControl 之间切换
WPF MVVM 通过事件将 UserControl 从一个 ObservableCollection 移动到另一个