WPF MVVM 绑定到父视图的视图模型属性



我有两个视图:

  • ShellView - DataContext: ShellViewModel
  • volumeviewview - DataContext: VolumeViewerViewModel

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

在每个上下文中,事情都运行得很顺利,正如预期的那样。

然而,在VolumeViewerView中,我有一个<Image>,我想从ShellViewModel控制其光标。

代码如下:

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}}}"/>

当我将光标绑定到VolumeViewerViewModel中的属性时,事情会像预期的那样工作。但这里没有连接。

我在这里、这里和这里寻找答案。

我想知道,考虑到它们在不同的文件中,这是否可能?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,并且绑定工作如预期的那样。

最新更新