wpf ContentPresenter不会启用/禁用

时间:2009-08-13 14:22:20

标签: wpf mvvm wpf-controls contentpresenter

我已经覆盖了一个ComboBox,以便在组合结束时添加一个额外的按钮 - 我正在使用它来帮助浏览我的应用程序。

它是一个M-V-VM应用程序,具有编辑 - 保存/取消机制,根据用户是否处于“编辑模式”,禁用或启用控件。无论视图是启用还是禁用,我都希望我的导航按钮始终可用。

为实现这一目标,我将ToggleButtonContentPresenter绑定到我的模型上的IsEditable属性。

切换按钮按预期启用和禁用,但组合的文本保持启用状态。

由于文字是由ContentPresenter投放的,ContentPresenter有一个IsEnabled属性,我无法理解为什么它不会禁用?

有人可以帮忙吗?谢谢安迪

<Style TargetType="local:EntityCombo">
    <Setter Property="SnapsToDevicePixels" Value="true"/>
    <Setter Property="OverridesDefaultStyle" Value="true"/>
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
    <Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
    <Setter Property="MinWidth" Value="120"/>
    <Setter Property="MinHeight" Value="20"/>
    <Setter Property="FontSize" Value="12" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:EntityCombo" >
                <Grid>
                    <ToggleButton 
                        IsEnabled="{Binding IsEditable}"
                        Name="ToggleButton" 
                        Template="{DynamicResource ComboBoxToggleButton}" 
                        Grid.Column="2" 
                        Focusable="false"
                        IsChecked="{Binding Path=IsDropDownOpen,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}"
                        ClickMode="Press">
                    </ToggleButton>
                    <Button Grid.Column="2" Style="{DynamicResource EntitySelectedButton}" Command="{TemplateBinding EntitySelected}" CommandParameter="{TemplateBinding SelectedItem}"></Button>
                    <ContentPresenter
                        IsEnabled="{Binding IsEditable}"
                        Name="ContentSite"
                        IsHitTestVisible="False" 
                        Content="{TemplateBinding SelectionBoxItem}"
                        ContentTemplate="{DynamicResource SelectionBoxItem}" 
                        ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
                        Margin="3,3,23,3"
                        VerticalAlignment="Center"
                        HorizontalAlignment="Left" />
                    <Popup 
                        Name="Popup"
                        Placement="Bottom"
                        IsOpen="{TemplateBinding IsDropDownOpen}"
                        AllowsTransparency="True" 
                        Focusable="False"
                        PopupAnimation="Slide">
                        <Grid 
          Name="DropDown"
          SnapsToDevicePixels="True"                
          MinWidth="{TemplateBinding ActualWidth}"
          MaxHeight="{TemplateBinding MaxDropDownHeight}">
                            <Border 
            x:Name="DropDownBorder"
            Background="{StaticResource WindowBackgroundBrush}"
            BorderThickness="1"
            BorderBrush="{StaticResource SolidBorderBrush}"/>
                            <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True">
                                <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" />
                            </ScrollViewer>
                        </Grid>
                    </Popup>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="HasItems" Value="false">
                        <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="DarkGray"/>
                    </Trigger>

                    <Trigger Property="IsEnabled" Value="true">
                        <Setter Property="Foreground" Value="Red"/>

                    </Trigger>
                    <Trigger Property="IsGrouping" Value="true">
                        <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                    </Trigger>
                    <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="true">
                        <Setter TargetName="DropDownBorder" Property="CornerRadius" Value="4"/>
                        <Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,0"/>
                    </Trigger>

                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
    </Style.Triggers>
</Style>

1 个答案:

答案 0 :(得分:2)

这是一个棘手的问题,但我在WPF中已经足够长,以至于非常执着。 :) 在我上次评论中提出这个问题之后,我的精神错乱促使我对其进行测试,这确实是问题所在:

模板根据ComboBox.Foreground设置ComboBox.IsEnabled,但您希望根据DataContext.IsEnabled设置内容的样式,因此您需要设置ContentPresenter本身的样式。但是你不能设置ContentPresenter样式,因为它继承自FrameworkElement,而不是Control。但是您可以将ContentPresenter替换为ContentControl,并使用适当的触发器为您的禁用外观设置样式。