一个控件的多个dataContext - MVVM

Ofi*_*fir 6 wpf datacontext mvvm

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

我有一个网格单元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>
Run Code Online (Sandbox Code Playgroud)

我想让这个DataTemplate显示一些超链接("Data.MapLink"是包含链接值的对象),每次单击此链接将触发命令"OpenLinkCommand".

问题是"Data.MapLink"和"OpenLinkCommand"位于不同的dataContext中,然后我必须选择以下选项之一:

  1. 保留超链接dataContext作为它 - 命令不会工作,超链接将获得Data.MapLink值.

  2. 将超链接dataContext更改为命令datacontext - 该命令将起作用,但超链接名称将为空.

遗憾的是我没有选择将这些项放在同一个dataContext中,所以我必须找到一种方法告诉命令它dataContext是"X"并告诉hyperLink它dataContext是"Y".

我希望我的问题很清楚如何解决这个问题?

Rac*_*hel 17

您可以使用一些绑定属性Source为绑定指定不同于默认值的绑定属性DataContext

最常见的是ElementName或者RelativeSource,它会在VisualTree中找到另一个UI元素,因此您可以绑定它的属性.

例如,以下用于ElementName告诉绑定它应该MyGridView用作绑定源,并绑定到MyGridView.DataContext.OpenLinkCommand

<Hyperlink Command="{Binding ElementName=MyGridView, 
                             Path=DataContext.OpenLinkCommand}"> 
Run Code Online (Sandbox Code Playgroud)

您还可以RelativeSource在绑定中使用以在指定对象类型的VisualTree中找到对象,并将其用作绑定源.此示例与上面的示例执行相同的操作,除了它使用RelativeSource而不是ElementName,因此您GridView不需要Name指定.

<Hyperlink Command="{Binding 
               RelativeSource={RelativeSource AncestorType={x:Type GridView}}, 
               Path=DataContext.OpenLinkCommand}"> 
Run Code Online (Sandbox Code Playgroud)

第三个选项是将绑定的Source属性设置为静态对象,如下所示:

<Hyperlink Command="{Binding 
               Source={x:Static local:MyStaticClass.OpenLinkCommand}}"> 
Run Code Online (Sandbox Code Playgroud)

根据你在这里关于绑定到单身人士的评论,这可能是你的最佳选择.