WPF MVVM 绑定到父视图的 ViewModel 属性

WPF MVVM Binding to parent view's ViewModel property

我有两种看法:

ShellView 是我程序的根,它包含 3 个 VolumeViewerView 对象(使用它们的 ViewModel 实例)。

在每个上下文中,事情 运行 非常顺利并且符合预期。

但是,在 VolumeViewerView 中,我有一个 <Image> 我想从 ShellViewModel 控制其 Cursor。

代码如下:

ShellView.xaml - MainViewVolumeViewerViewModel

的一个实例
<Frame  Grid.Row="1" Grid.Column="0" Grid.RowSpan="3" Content="{Binding MainView}"/>

ShellViewModel.cs

private Cursor _editorCursor;
public Cursor EditorCursor
{
    get { return _editorCursor; }
    set
    {
        _editorCursor = value;
        NotifyOfPropertyChange(() => EditorCursor);
    }
}

VolumeViewerView.xaml

<Image [OTHER PROPERTIES] 
    Cursor="{Binding Path=DataContext.EditorCursor, 
                     RelativeSource={RelativeSource Mode=FindAncestor, 
                                     AncestorType={x:Type local:ShellView}}}"/>

当我将 Cursor 绑定到 VolumeViewerViewModel 中的 属性 时,一切正常。但是这里没有连接。

我一直在寻找答案 here, here, and here。但其中 none 正在工作。

我想知道,考虑到它们在不同的文件中,这是否可能? FindAncestor 是否仅在同一 xaml 文件的上下文中有效?

如果不可能,什么是好的替代方案?我可以在 VolumeViewerViewModel 中创建 EditorCursor 并在每次设置 ShellViewModel 中的 EditorCursor 时设置它,但这看起来有点难看。如果这是唯一的方法,我可能会选择去那里。但我真的很喜欢建议!

正如@Clemens 在评论中指出的那样,视觉树以 Frame 元素结尾。这是我问题的根源。我将子视图放在 Frame 中,这意味着 FindAncestor 无法找到父元素及其 DataContext.

我编辑了 ShellView.xaml,替换了 Frame:

<ContentControl  Grid.Row="1" Grid.Column="0" Grid.RowSpan="3" Content="{Binding MainView}"/>

这意味着我还必须编辑子视图(它最初继承了 Page,不能是 ContentControl 的内容)。我做到了 UserControl 并且绑定按预期工作。