【问题标题】:WPF MVVM Binding to parent view's ViewModel propertyWPF MVVM 绑定到父视图的 ViewModel 属性
【发布时间】:2021-09-18 23:20:57
【问题描述】:

我有两种看法:

  • ShellView - 数据上下文:ShellViewModel
  • VolumeViewerView - 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}}}"/>

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

我一直在寻找答案 hereherehere。但它们都不起作用。

我想知道,考虑到它们位于不同的文件中,这是否可能? FindAncestor 是否只能在同一个 xaml 文件的上下文中工作?

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

【问题讨论】:

  • RelativeSource FindAncestor 在元素位于同一可视树中时有效。你的观点是这样吗?
  • @Clemens 我试图绑定的视图是VolumeViewerView,它使用Frame 加载到ShellView。因此,正如我在问题中描述的那样,它们是两个不同的文件。
  • 它确实与文件有关。只是元素是否在同一个可视化树中。框架是树的边界。
  • @Clemens 除非Frame 是嵌入VolumeViewerView 的错误方法,否则我会假设它们在同一棵树中。也许我嵌入它的方式是错误的,因此无法找到合适的祖先?
  • @Clemens 好的,我终于能够修复它。最初我将VolumeViewerView 定义为Page,我无法将其嵌入ContentControl,所以我改用Frame。我将其更改为UserControl 并将其嵌入ContentControl 而不是Frame 并且绑定有效。这有什么特别的原因吗?

标签: c# wpf mvvm


【解决方案1】:

正如 cmets 中的 @Clemens 所指出的,可视化树以 Frame 元素结束。这是我问题的根源。我将子视图放在Frame 中,这意味着FindAncestor 无法找到父元素及其DataContext

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-26
    • 2011-02-01
    • 2011-01-31
    • 2011-03-11
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多