wpf - 为 RelativeSource 绑定(bind)定义混合表达式 ViewModel 定义

标签 wpf xaml mvvm user-controls blend

我有一个 UserControl (MyCompositeView) 我在其中添加了一些其他 UserControls (我的详细信息 View )。为了获得智能感知和重构能力,我在 CompositeView 中添加了 d:DataContextxaml .

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

有没有办法让 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 DetailisVisible{get;set;}

    public MyDetailViewModel DetailViewModel { get; }
}   

最佳答案

尝试按元素名称绑定(bind):

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

关于wpf - 为 RelativeSource 绑定(bind)定义混合表达式 ViewModel 定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30455236/

相关文章:

wpf - 将 ContextMenu 的来源传递给 WPF 命令

android - 当 Fragment 恢复时隐藏 progressBar

c# - 从 C# 代码动态切换 WPF 网格列的可见性

c# - 为什么我的 XAML 代码没有运行?

wpf - 如何在 WPF UI 代码中等待后台线程/操作完成?

c# - 如何在与 ItemsSource 绑定(bind)的 ListBox 中显示子元素的属性?

java - MutableLiveData 的观察者未被触发

model-view-controller - 如何从业务/模型类发送进度更新?

c# - 命名空间在构建 RELEASE 时消失,但在 DEBUG 时存在

c# - 弯曲并遵循某些路径几何形状的 WPF 动画