【发布时间】:2021-09-18 23:20:57
【问题描述】:
我有两种看法:
- ShellView - 数据上下文:ShellViewModel
- VolumeViewerView - 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}}}"/>
当我将 Cursor 绑定到 VolumeViewerViewModel 中的一个属性时,一切正常。但是这里没有连接。
我一直在寻找答案 here、here 和 here。但它们都不起作用。
我想知道,考虑到它们位于不同的文件中,这是否可能? FindAncestor 是否只能在同一个 xaml 文件的上下文中工作?
如果不可能,有什么好的选择?我可以在VolumeViewerViewModel 中创建EditorCursor 并在每次设置ShellViewModel 中的EditorCursor 时设置它,但这看起来有点难看。如果这是唯一的方法,我可能会选择去那里。但我真的很喜欢建议!
【问题讨论】:
-
RelativeSource FindAncestor在元素位于同一可视树中时有效。你的观点是这样吗? -
@Clemens 我试图绑定的视图是
VolumeViewerView,它使用Frame加载到ShellView。因此,正如我在问题中描述的那样,它们是两个不同的文件。 -
它确实与文件有关。只是元素是否在同一个可视化树中。框架是树的边界。
-
@Clemens 除非
Frame是嵌入VolumeViewerView的错误方法,否则我会假设它们在同一棵树中。也许我嵌入它的方式是错误的,因此无法找到合适的祖先? -
@Clemens 好的,我终于能够修复它。最初我将
VolumeViewerView定义为Page,我无法将其嵌入ContentControl,所以我改用Frame。我将其更改为UserControl并将其嵌入ContentControl而不是Frame并且绑定有效。这有什么特别的原因吗?