gpt4 book ai didi

wpf - 一个控件的多个 dataContext - MVVM

转载 作者:行者123 更新时间:2023-12-04 13:16:55 28 4
gpt4 key购买 nike

我不确定我的问题标题是否完全代表我的问题,我会尽力解释:

我有一个网格单元 DataTemplate:(网格属于第三方公司,但对我的问题并不重要)

<DataTemplate>
<TextBlock>
<Hyperlink Command="{Binding OpenLinkCommand}">
<Hyperlink.ToolTip>
<TextBlock Text="{Binding Data.MapLink}"/>
</Hyperlink.ToolTip>
<TextBlock Text="{Binding Data.MapLink}" TextDecorations="underline">
</Hyperlink>
</TextBlock>
</DataTemplate>

我想让这个 DataTemplate 显示一些超链接(“Data.MapLink”是包含链接值的对象),每次点击这个链接都会触发命令“OpenLinkCommand”。

问题是“Data.MapLink”和“OpenLinkCommand”位于不同的dataContext中,然后我必须选择以下选项之一:
  • 保留超链接 dataContext - 该命令将不起作用,超链接将获取 Data.MapLink 值。
  • 将超链接 dataContext 更改为命令 datacontext - 该命令将起作用,但超链接名称将为空。

  • 遗憾的是我没有选项将这些项目放在同一个 dataContext 中,所以我必须找到一种方法来告诉命令它的 dataContext 是“X”并告诉超链接它的 dataContext 是“Y”。

    我希望我的问题很清楚
    我怎么解决这个问题?

    最佳答案

    您可以使用一些绑定(bind)属性来指定不同的 Source为您的绑定(bind)而不是默认 DataContext
    最常见的是ElementNameRelativeSource ,它将在 VisualTree 中找到另一个 UI 元素,以便您可以绑定(bind)到它的属性。

    例如,以下使用 ElementName告诉绑定(bind)它应该使用 MyGridView作为绑定(bind)源,并绑定(bind)到MyGridView.DataContext.OpenLinkCommand

    <Hyperlink Command="{Binding ElementName=MyGridView, 
    Path=DataContext.OpenLinkCommand}">

    您也可以使用 RelativeSource在绑定(bind)中查找指定对象类型的 VisualTree 的更上方的对象,并将其用作绑定(bind)源。这个例子和上面的例子做同样的事情,除了它使用 RelativeSource而不是 ElementName ,所以你的 GridView不需要 Name指定的。
    <Hyperlink Command="{Binding 
    RelativeSource={RelativeSource AncestorType={x:Type GridView}},
    Path=DataContext.OpenLinkCommand}">

    第三个选项是设置绑定(bind)的 Source静态对象的属性,如下所示:
    <Hyperlink Command="{Binding 
    Source={x:Static local:MyStaticClass.OpenLinkCommand}}">

    基于 your comment here关于绑定(bind)到单例,这可能是您的最佳选择。

    关于wpf - 一个控件的多个 dataContext - MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15498890/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com