为 RelativeSource 绑定定义 Blend Expression ViewModel 定义

Define Blend Expression ViewModel definition for RelativeSource binding

我有一个 UserControl (MyCompositeView),我在其中添加了一些其他 UserControls (MyDetailView)。为了获得智能感知和重构能力,我在 xaml 中向 CompositeView 添加了 d:DataContext

为了在添加新 DataContext 的同时操作 UserControl,我将可见性绑定到 RelativeSource(我的 CompositeViewModel)。不幸的是,针对 MyCompositeViewModel 的匹配不适用于编辑器中的此绑定。

有没有办法让visual studio知道我的DataContext.DetailsIsVisibleDataContext来自MyCompositeViewModel类型?

<UserControl 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    x:Class="Example.MyCompositeView"
    d:DataContext="{d:DesignInstance Type=MyCompositeViewModel}"
    d:DesignHeight="300"
    d:DesignWidth="300"
    mc:Ignorable="d">

     <Grid>
        <detail:MyDetailView 
            DataContext="{Binding Path=DetailViewModel}"
            Visibility="{Binding RelativeSource={RelativeSource FindAncestor,
                AncestorType={x:Type UserControl}},
                Path=DataContext.DetailsIsVisible,
                Converter={StaticResource BooleanToVisibilty}}" />
     </Grid>

 </UserControl>

--

public class MyCompositeViewModel : IMyCompositeViewModel {

    public bool DetailisVisible{get;set;}

    public MyDetailViewModel DetailViewModel { get; }
}   

尝试按元素名称绑定:

<UserControl 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    x:Class="Example.MyCompositeView"
    x:Name="root"
    d:DataContext="{d:DesignInstance Type=MyCompositeViewModel}"
    d:DesignHeight="300"
    d:DesignWidth="300"
    mc:Ignorable="d">

     <Grid>
        <detail:MyDetailView 
            DataContext="{Binding Path=DetailViewModel}"
            Visibility="{Binding ElementName="root"},
                Path=DataContext.DetailsIsVisible,
                Converter={StaticResource BooleanToVisibilty}}" />
     </Grid>

 </UserControl>

或翻转属性顺序:

<UserControl 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    x:Class="Example.MyCompositeView"
    d:DataContext="{d:DesignInstance Type=MyCompositeViewModel}"
    d:DesignHeight="300"
    d:DesignWidth="300"
    mc:Ignorable="d">

     <Grid>
        <detail:MyDetailView            
            Visibility="{Binding DetailsIsVisible, Converter={StaticResource BooleanToVisibilty}}" 
            DataContext="{Binding DetailViewModel}"/>
     </Grid>

 </UserControl>