wpf - Accessing multiple view models
问题描述
I have 2 simple user controls and 2 view models that bind to them. I now want to add these to a master user control but want to know the correct way of accessing ViewModel properties from View 1 in my View 2 in the text block named FromView1?
My View 1:
<UserControl x:Class="v1"
.....
<Grid>
<TextBlock Text="{Binding Text1}" />
</Grid>
</UserControl>
My View 2:
<UserControl x:Class="v2"
..
<Grid>
<StackPanel>
<TextBlock Text="{Binding Text2}" />
<TextBlock x:name="FromView1" Text="{Binding Text1}" Background="Red" Width="100" />
</StackPanel>
</Grid>
</UserControl>
My main view containing View 1 and View 2
<UserControl x:Class="vMain"
....
<Grid Margin="20">
<StackPanel>
<local:v1 x:Name="v1"/>
<local:v2 x:Name="v2"/>
</StackPanel>
</Grid>
</UserControl>
解决方案
您应该将它们合并到一个单独的视图模型中,而不是拥有两个单独的视图模型MainViewModel
。v1
然后v2
应该DataContext
与vMain
视图共享,这意味着他们可以绑定到他们想要做的任何属性。
因此,只需将DataContext
of设置vMain
为一个实例,MainViewModel
并确保您没有在某处设置DataContext
ofv1
或显式设置。v2
UserControls
一般来说应该没有自己的视图模型。他们应该从他们的父母那里继承DataContext
,这通常是一个窗口。
如果您的视图模型趋于变大,您可以使用部分类将定义拆分到多个源代码文件中。
推荐阅读
- python - python:带有可选命令行参数的argparse
- php - 使用其他类 Symfony 的常量
- java - 如何解决二维数组的问题
- scala - 在测试容器的 PostgreSQL 容器中应用迁移
- c# - 使用 C# 增量扫描新的/修改的 FTP 文件
- mysql - MySQL LOAD DATA INFILE csv 列数据与换行符
- node.js - 在 Alexa Skill 中创建一系列卡片并展示它们
- mysql - mysql.data.mysqlclient.mysqlexception 错误 C#
- java - 找不到能够从类型 [java.util.LinkedHashMap ]转换为类型的转换器
- php - 如何将类变量传递给codeigniter中的视图?