为 RelativeSource 绑定定义 Blend Expression ViewModel 定义

Posted

技术标签:

【中文标题】为 RelativeSource 绑定定义 Blend Expression ViewModel 定义【英文标题】:Define Blend Expression ViewModel definition for RelativeSource binding 【发布时间】:2015-05-26 09:55:40 【问题描述】:

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

为了在向 UserControl 添加新的 DataContext 时对其进行操作,我将 Visiblity 绑定到 RelativeSource(我的 CompositeViewModel)。不幸的是,与 MyCompositeViewModel 的匹配不适用于编辑器中的此绑定。

有没有办法让 Visual Studio 知道我的 DataContextDataContext.DetailsIsVisible 来自 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 DetailisVisibleget;set;

    public MyDetailViewModel DetailViewModel  get; 
   

【问题讨论】:

【参考方案1】:

尝试按元素名称绑定:

<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>

【讨论】:

以上是关于为 RelativeSource 绑定定义 Blend Expression ViewModel 定义的主要内容,如果未能解决你的问题,请参考以下文章

背水一战 Windows 10 (19) - 绑定: TemplateBinding 绑定, 与 RelativeSource 绑定, 与 StaticResource 绑定

DataContext 和绑定 self 作为 RelativeSource

在WPF中如何使用RelativeSource绑定

来自 ToolTip 或 ContextMenu 的 RelativeSource 绑定

WPF---数据绑定之RelativeSource

Silverlight 4 RelativeSource FindAncestor 绑定