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

qfe3c7zg  于 2023-10-22  发布在  其他
关注(0)|答案(3)|浏览(111)

我正在使用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>

. where“Source={?我就在这里卡住了...
我发现了一个类似的问题,有一个公认的答案,似乎真的很好:https://stackoverflow.com/a/1959701/1121033这个想法是将视图模型作为一个带有键的资源添加,然后使用Source={StaticResource key}绑定到它。然而,我不能让它工作,可能是因为我的视图模型是使用上面显示的视图模型语法找到的,无论我写什么,它都不是可接受的语法。
有谁能帮我把这个解决方案应用到我的问题上吗?

wtlkbnrh

wtlkbnrh1#

我建议基于您提供的UserControl的DataContext绑定的XAML的变体:

<TextBlock Text="{Binding SettingUserEdit.ApplicationVersion, Source={StaticResource Locator}}" />

我不太明白为什么要用这种方式声明UserControl的DataContext绑定。在应用程序(推荐选项)或Windows中的资源中声明。
在这两种情况下,绑定可以写成:

<UserControl -------------------------
             -------------------------
             DataContext="{Binding SettingUserEdit, Source={StaticResource Locator}}">
pexxcrt2

pexxcrt22#

如果StackPanel位于UserControl中,则可以使用{RelativeSource}绑定到父UserControlDataContext

<TextBlock Text="{Binding Path=DataContext.ApplicationVersion, 
    RelativeSource={RelativeSource AncestorType=UserControl}}" />
nkoocmlb

nkoocmlb3#

如果你坚持要改变部分视图的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>

我个人会使用SelectedUser作为绑定路径的一部分:

<StackPanel x:Name="EditUserContainer">
  <TextBlock Text="{Binding SelectedUser.DisplayName}" />
  <TextBlock Text="{Binding SelectedUser.LastLoggedIn, StringFormat='Last login: \{0}'"/>
  <TextBlock Text="{Binding ApplicationVersion, StringFormat='Application version: \{0}'"/>
</StackPanel>

相关问题