Wpf 网格内的ContentPresenter可见性绑定不工作?
我有以下表格:Wpf 网格内的ContentPresenter可见性绑定不工作?,wpf,grid,converter,visibility,contentpresenter,Wpf,Grid,Converter,Visibility,Contentpresenter,我有以下表格: <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> ... <ContentPresenter
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
...
<ContentPresenter Grid.Row="1" Content="{Binding Path=PredictiveWorkspace}"
Visibility="{Binding Path=ShowPredictiveWorkspace,
Converter={StaticResource boolToVisibility}}"/>
<ContentPresenter Grid.Row="1" Content="{Binding Path=M2Workspace}"
Visibility="{Binding Path=ShowStandardWorkspace,
Converter={StaticResource boolToVisibility}}"/>
...
</Grid>
问题是:contentpresenter
都是可见的!我还注意到,应用程序只读取ShowPredictiveWorkspace
属性。从未调用在ShowStandardWorkspace
getter上设置的断点。
我想这是个愚蠢的错误,但我真的找不到
编辑:
可能的错误来源:
- 拼写错误显示标准工作区
- 在属性设置程序中未引发OnPropertyChanged(“ShowStandardWorkspace”)
- ShowStandardWorkspace属性未设置为false
- 第二个ContentPresenter的数据上下文可能错误
存储类型。当您使用ContentPresenter时,DataContext是不同的,但是您可以在可视化树中向上导航以找到它。就你而言:
Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type Grid}}, Path=ShowStandardWorkspace}"
其中,默认情况下网格是第一个祖先,并使用其DataContext
。如果需要第二个、第三个等祖先,请使用带有int
值的AncestorLevel
属性。
我认为转换器很好。我已经搜索了很多次,并且做了一些测试,我非常确定您无法控制contentpresenter的可见性。另外-如果在显示视图时,ContentPresenter
将要显示的ViewModel为null,则它甚至不会使用boolToVisibilityConverter
读取属性
我做了一个简单的解决方法-我将ContentPresenter
放在网格
中(显然可以使用其他类型的容器),并将网格的可见性
绑定到布尔属性。它工作得很好。这是因为在ContentPresenter
元素上用转换器绑定可见性不起作用
如果将ContentPresenter
更改为ContentControl
,则可以使用转换器绑定可见性属性,这样就不必将其嵌套在其他元素中
这显然是因为ContentPresenter
是一个轻量级元素,用于ControlTemplate
中
(我强调):
您通常使用
ContentControl指定要添加内容的位置。每一个
ContentControl类型的默认值为ContentPresenter
控制模板
当ContentPresenter对象位于
ContentControl的ControlTemplate、内容、ContentTemplate和
ContentTemplateSelector属性从
与ContentControl同名的属性。你可以有
ContentPresenter属性从中获取这些属性的值
通过设置ContentSource,模板化父级的其他属性
属性或对它们的绑定
嗯,那不是真的。@Somedust-你是对的。鲁道夫金所写的不是真的。我检查了(以防万一),但很明显,因为第一个contentpresenter读取属性时没有问题。1.拼写错误-不是,我复制/粘贴了所有内容。2.OnPropertyChanged被提升,更多的是-处理程序不是空的,所以某个东西被绑定对了吗?3.这是错误的。4.如果上下文与第一个ContentPresenter位于同一个视图模型中,并且它是同一个视图,那么它怎么可能是错误的呢?那么它应该可以工作:)您可以在运行时使用Snoop检查绑定吗。感谢您提供有关Snoop的提示,这是一款非常有趣的应用程序。我在前面的同一个视图中使用了BooltVisibilityConverter
,我注意到InSnoop的“可见性”属性高亮显示为绿色。但是,在这两个有问题的内容演示者中,它都以红色突出显示。奇怪的我必须再仔细检查一遍。这可能与开始时M2Workspace
为空有关吗?我认为这不应该,因为ContentPresenter的可见性不应该与其呈现的内容相关,对吗?您可以通过将两个演示者绑定到同一内容来验证这一假设。通常,您可以控制ContentPresenter的可见性。问题在于,设置Content属性也会将ContentPresenter的DataContext设置为相同的值,从而破坏所有期望DataContext从父控件继承的绑定。
public bool ShowStandardWorkspace
{
get { return this._showStandardWorkspace; }
set
{
this._showStandardWorkspace = value;
this.OnPropertyChanged(() => this.ShowStandardWorkspace);
}
}
Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type Grid}}, Path=ShowStandardWorkspace}"