我正在考虑为我的应用程序编写WPF用户控件.我在我的应用程序中使用MVVM.
用户控件可能需要可以设置为父视图的依赖项属性.当使用MVVM时,想法是父视图最终将在UserControlsDP与父视图的VM 之间创建绑定)
Dependency Properties需要在View类中创建,因为VM不会继承DependencyObject.这意味着在XAML代码中添加代码.
我想知道你是否可以就使用MVVM开发WPF应用程序时如何设计用户控件提出建议......
这就是我想要做的:
UserControl是我希望被其他开发者消费的.我希望最终用户能够使用依赖属性来使用我的控件.
<lib:ControlView ControlsText={Binding Path=UsersOwnViewModelText} />
Run Code Online (Sandbox Code Playgroud)我正在使用MVVM模式.
我将我的ViewModels绑定到他们的View使用 <DataTemplates>
<DataTemplate DataType="{x:Type local:ControlViewModel}">
<local:ControlView />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)所以我有两个问题:
我是否认为如果在XAML中使用UserControl,那么UserControl必须将ViewModel设置为DataContext控件Loaded事件触发时的方式而不是使用<DataTemplate>方法?
如何允许用户将数据绑定到我的控件的依赖项属性,同时仍然是绑定到我的ViewModel的数据?
我有一个用户控件,其中包含其他几个用户控件.我正在使用MVVM.每个用户控件都有一个相应的VM.这些用户控件如何相互发送信息?我想避免在后面的xaml代码中编写任何代码.特别是我对控件(主用户控件内部)如何相互通信以及如何与容器用户控件进行通信感兴趣.
编辑:我知道使用事件代表将帮助我解决这个问题.但是,我想避免在xaml代码隐藏中编写任何代码.
我正在阅读这篇文章,作者提出了使用DataTemplates定义ViewModel的建议,这是一种疯狂的方式(#7).我一直这样做,真的那么糟糕吗?
<DataTemplate DataType="{x:Type local:MyViewModel}">
<Grid>
...
</Grid>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
我的大多数视图都只是一个定义一个或两个DataTemplate的ResourceDictionary.对我而言,这比为每个ViewModel创建UserControl更有意义.为什么我不想在WPF的可视化树中使用额外的图层?当DataTemplate为我做这件事时,为什么我要照顾将ViewModels映射到Views?这种语法真的是一种"疯子式"吗?
我注意到许多WPF MVVM框架似乎避免使用NavigationWindow和Page控件来支持使用嵌套UserControls组合页面.
NavigationWindow和Page提供了在日志中启用后退和前进导航的简便方法,以及提供在页面之间传递数据的简便方法.我见过的大多数MVVM框架都以各种方式重新实现这些功能.
是否有特定的理由避免使用NavigationWindow和Page?