使用MVVM的WPF:使用RelativeSource的DataBinding

use*_*101 9 c# wpf mvvm mvvm-light c#-4.0

我有一个控件,在该控件中我有一个带有数据tempalte的资源:

  <DataTemplate DataType="{x:Type local:FlowModel}">
    <Image Source="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type vm:MainViewModel}}, Path=MainViewModel.ImagePath}"/>
  </DataTemplate>

 xmlns:vm="clr-namespace:CortexMonitoringTool.ViewModel"
Run Code Online (Sandbox Code Playgroud)

我将vm设置为我的ViewModel文件夹,我正在实现mvvm.我不能让我的约束力工作,我不确定为什么不.

有人可以告诉我,如果我的相对绑定是正确的,它是否可以在我的MainViewModel类中实际看到我的属性'ImagePath'?

public String ImagePath
    {
        get
        {
            return _imagePath;
        }
        set
        {
            if (_imagePath == value)
            {
                return;
            }
            _imagePath = value;
            RaisePropertyChanged("ImagePath");
        }
    }
Run Code Online (Sandbox Code Playgroud)

谢谢.

use*_*101 10

嗨,我设法让它工作.

  <DataTemplate DataType="{x:Type local:FlowModel}">
    <Image Source="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.ImagePath}"/>
  </DataTemplate>
Run Code Online (Sandbox Code Playgroud)

我将AncestorType改为'Window',它已经准备好绑定到我的MainViewModel,然后使用'DataContext'.在我的路径中能够看到我的财产.

希望这有助于其他人!!


JSJ*_*JSJ 5

您的视图模型不是您的可视化树的一部分。所以 find 祖先类型在那里不起作用。并且如果您找到具有数据上下文的根父级,那么您可以使用其属性进行绑定。

<Image Source={...... Path=DataContext.MyProperty}"/>
Run Code Online (Sandbox Code Playgroud)