Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 网格内的ContentPresenter可见性绑定不工作?_Wpf_Grid_Converter_Visibility_Contentpresenter - Fatal编程技术网

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