WPF MVVM 绑定到父视图的 ViewModel 属性
WPF MVVM Binding to parent view's ViewModel property
我有两种看法:
- ShellView - DataContext:ShellViewModel
- VolumeViewerView - DataContext:VolumeViewerViewModel
ShellView 是我程序的根,它包含 3 个 VolumeViewerView 对象(使用它们的 ViewModel 实例)。
在每个上下文中,事情 运行 非常顺利并且符合预期。
但是,在 VolumeViewerView 中,我有一个 <Image>
我想从 ShellViewModel 控制其 Cursor。
代码如下:
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, 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
并且绑定按预期工作。
我有两种看法:
- ShellView - DataContext:ShellViewModel
- VolumeViewerView - DataContext:VolumeViewerViewModel
ShellView 是我程序的根,它包含 3 个 VolumeViewerView 对象(使用它们的 ViewModel 实例)。
在每个上下文中,事情 运行 非常顺利并且符合预期。
但是,在 VolumeViewerView 中,我有一个 <Image>
我想从 ShellViewModel 控制其 Cursor。
代码如下:
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, 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
并且绑定按预期工作。