我有两个视图:
- ShellView - DataContext: ShellViewModel
- volumeviewview - DataContext: VolumeViewerViewModel
ShellView是根在我的程序,它包含3 VolumeViewerView对象(使用他们的ViewModel实例)。
在每个上下文中,事情都运行得很顺利,正如预期的那样。
然而,在VolumeViewerView中,我有一个<Image>
,我想从ShellViewModel控制其光标。
代码如下:
ShellView。xaml -MainView
是VolumeViewerViewModel
的一个实例
<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
,并且绑定工作如预期的那样。