为 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 知道我的 DataContext
的 DataContext.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