wpf ContentPresenter 不会启用/禁用

标签 wpf mvvm wpf-controls contentpresenter

我已经覆盖了 ComboBox为了在组合的末尾添加一个额外的按钮 - 我正在使用它来帮助浏览我的应用程序。

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

为了实现这一点,我绑定(bind)了 ToggleButtonContentPresenterIsEditable我的模型上的属性。

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

由于文本由 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>

最佳答案

这是一个棘手的问题,但我已经在 WPF 中深入研究了足够长的时间来非常坚持。 :)
在我上一条评论中提出这个建议后,我的精神错乱驱使我进行测试,这确实是问题所在:

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

关于wpf ContentPresenter 不会启用/禁用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1272277/

相关文章:

wpf - Blend 的 Assets 列表为空

c# - 使用 MVVM 更改应用程序主题

wpf - RichTextBox 在不可见时滚动到结束不起作用

silverlight - 我应该使用 KnockoutJS、SilverLight 还是两者都使用?

c# - 提交 ViewModel 中当前 WPF GUI 元素的编辑

wpf - 根据列表框中数据库中的记录动态添加行 mvvm mvvm light

.net - 重新排序 WPF TabControl 中的选项卡

wpf - WPF TextBlock 中的文本垂直对齐

c# - WPF 命令绑定(bind)到祖先属性

c# - 如何在绑定(bind) ItemsSource 时将按钮添加到 wpf 列表框