从继承的 DataContext 中绑定到视图模型

问题描述 投票:0回答:1

我正在使用 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}
绑定到它。 但是,我无法让它工作,可能是因为我的视图模型是使用上面显示的视图模型定位器找到的,无论我写什么,它都不被接受的语法。

有人可以帮助医学调整这个答案来解决我的问题吗?

wpf mvvm data-binding mvvm-light
1个回答
0
投票

如果您坚持更改部分视图的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>
© www.soinside.com 2019 - 2024. All rights reserved.