我正在使用 MVVM Light 更新项目。 在
UserEditView
中,有一个用户列表。选择一个用户,用户数据将出现在 StackPanel 中,可在其中进行编辑。
为了让事情变得更容易,StackPanel 将其 DataContext 设置为视图模型的
SelectedUser
属性。这意味着面板中的所有控件都可以使用{Binding <fieldname>}
。
但是,我已经向视图模型添加了一个属性,并且我想从面板内绑定到它。但我就是找不到一种方法来进行这种绑定。 如果我删除 StackPanel 中的
DataContext=
,并为所有绑定添加前缀“SelectedUser”,那么一切都可以很好地工作,但它很乏味且不优雅。
总结一下:
视图模型包含两个可绑定属性:
User SelectedUser;
string ApplicationVersion;
然后在视图中将其声明为数据源,如下所示:
<UserControl.DataContext>
<Binding Path="SettingUserEdit" Source="{StaticResource Locator}" />
</UserControl.DataContext>
视图包含很多控件,稍微往下看,我们发现:
<StackPanel x:Name="EditUserContainer" DataContext="{Binding SelectedUser}" >
<TextBlock Text="{Binding DisplayName}" />
<StackPanel Orientation="Horizontal">
<TextBlock Text="Last login: " />
<TextBlock Text="{Binding LastLoggedIn}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Application version: " />
<TextBlock Text="{Binding Source={????}, Path=ApplicationVersion}" />
</StackPanel>
...其中“Source={??????}”是我陷入困境的地方...
我发现了一个类似的问题,其已接受的答案似乎非常好:https://stackoverflow.com/a/1959701/1121033 这个想法是将视图模型添加为带有键的资源,然后使用
Source={StaticResource key}
绑定到它。
但是,我无法让它工作,可能是因为我的视图模型是使用上面显示的视图模型定位器找到的,无论我写什么,它都不被接受的语法。
有人可以帮助医学调整这个答案来解决我的问题吗?
如果您坚持更改部分视图的DataContext(这不是必需的),您可以引入额外的容器并更改其DataContext:
<StackPanel x:Name="EditUserContainer">
<StackPanel DataContext="{Binding SelectedUser}" >
<TextBlock Text="{Binding DisplayName}" />
<TextBlock Text="{Binding LastLoggedIn, StringFormat='Last login: \{0}'"/>
</StackPanel>
<TextBlock Text="{Binding ApplicationVersion, StringFormat='Application version: \{0}'"/>
</StackPanel>