ContentPresenter Grid内部的可见性绑定不起作用?

Joe*_*Joe 4 wpf grid visibility converter 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>
Run Code Online (Sandbox Code Playgroud)

这两个ContentPresenters具有相同的Grid.Row定义,因为它们中只有一个应该同时可见.我有以下boolToVisibility转换器:

[ValueConversion(typeof(bool), typeof(System.Windows.Visibility))]
public class BoolToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if ((bool)value)
        {
            return System.Windows.Visibility.Visible;
        }
        else
            return System.Windows.Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

而且问题在于:两者ContentPresenters都是可见的!我还注意到ShowPredictiveWorkspace应用程序只读取了属性.ShowStandardWorkspace永远不会调用在getter上设置的断点.我想这是一个愚蠢的错误,但我真的找不到它.

编辑:

public bool ShowStandardWorkspace
    {
        get { return this._showStandardWorkspace; }
        set
        {
            this._showStandardWorkspace = value;
            this.OnPropertyChanged(() => this.ShowStandardWorkspace);
        }
    }
Run Code Online (Sandbox Code Playgroud)

Ged*_*dde 9

这是因为它无法将可见性与ContentPresenter元素上的转换器绑定.

如果更改ContentPresenter为a ContentControl,则可以将visibility属性与转换器绑定,然后您不必将其嵌套在另一个元素中.

这显然是因为它ContentPresenter是一种轻量级元素,意味着在一个中使用ControlTemplate.

来自MSDN(我突出显示):

您通常使用ContentControl的ControlTemplate中的ContentPresenter来指定要添加内容的位置.每个ContentControl类型在其默认ControlTemplate中都有一个ContentPresenter.

当ContentPresenter对象位于ContentControl的ControlTemplate中时,Content,ContentTemplate和ContentTemplateSelector属性将从ContentControl的相同名称的属性中获取其值.您可以通过设置ContentSource属性或绑定它们,使ContentPresenter属性从模板化父级的其他属性中获取这些属性的值.