1

コンボの最後に追加のボタンを追加するためにa をオーバーライドしましたComboBox。これを使用して、アプリケーションをナビゲートします。

ユーザーが「編集モード」にあるかどうかに応じてコントロールを無効または有効にする編集保存/キャンセルメカニズムを持つ MV-VM アプリです。ビューが有効か無効かに関係なく、ナビゲーション ボタンを常に使用できるようにしたかったのです。

これを実現するために、 と をモデルのプロパティにバインドしToggleButtonています ContentPresenterIsEditable

トグル ボタンは期待どおりに有効化および無効化されますが、コンボのテキストは有効なままです。

テキストは によって配信され、ContentPresenterContentPresenterIsEnabledプロパティがあるため、無効にならない理由がわかりません。

誰でも手伝ってもらえますか? ありがとうアンディ

<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>
4

1 に答える 1

2

これはトリッキーなものですが、私はWPFにひざまずいて、非常に粘り強く取り組んできました。:)私の最後のコメントでこれを示唆した後、私の狂気は私にそれをテストするように駆り立てました、そしてそれは確かに問題です:

テンプレートはComboBox.Foregroundに基づいて設定されComboBox.IsEnabledますが、に基づいてコンテンツのスタイルを設定DataContext.IsEnabledする必要があるため、ContentPresenterそれ自体のスタイルを設定する必要があります。ただし、Controlではなく、ContentPresenterから継承するため、スタイルを設定することはできません。ただし、をaにFrameworkElement置き換えて、無効になっている外観に適したトリガーでスタイルを設定することができます。ContentPresenterContentControl

于 2009-08-13T14:29:18.543 に答える