2009-08-13 18 views
1

我已經重寫了一個ComboBox爲了在組合結尾添加一個額外的按鈕 - 我使用它來幫助導航我的應用程序。wpf ContentPresenter不會啓用/禁用

它的M-V-VM應用程序具有Edit-Save/Cancel機制,根據用戶是否處於「編輯模式」禁用或啓用控件。我希望無論View是啓用還是禁用,我的導航按鈕始終可用。

爲了達到此目的,我將ToggleButtonContentPresenter綁定到我的Model上的IsEditable屬性。

切換按鈕啓用和禁用按預期方式,但組合文本保持啓用狀態。

由於文本是由ContentPresenter交付和ContentPresenterIsEnabled屬性我不明白爲什麼它不會禁用?

任何人都可以協助嗎?謝謝安迪

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

回答

2

這是一個棘手的問題,但我一直在WPF足夠長的膝蓋深,非常執着。 :) 在我最後的評論我的瘋狂建議在此之後開車帶我去測試它,它確實是問題:

模板基於ComboBox.IsEnabled設置ComboBox.Foreground,但你想樣式基於DataContext.IsEnabled的內容,所以你將需要自己設計ContentPresenter。但是你不能設計ContentPresenter,因爲它繼承自FrameworkElement而不是Control。但是,您可以用ContentControl替換ContentPresenter,並使用適當的觸發器設置您的禁用外觀。

+0

感謝您的建議,但IsEditable是在我的ViewModel這是DataContext。 ToggleButton工作正常,即啓用和禁用 - 它只是ContentPresenter不會啓用/禁用。 – 2009-08-13 15:47:58

+0

對不起 - 我沒有仔細閱讀那部分。這些具有約束力的怪癖可以如此加重。您是否嘗試過爲該綁定啓用跟蹤源(PresentationTraceSources.TraceLevel =「High」),以查看嘗試獲取值時實際發生的情況? – AndyM 2009-08-13 16:09:29

+0

即使我只是將ContentPresenter上的IsEnabled設置爲False,即我根本沒有綁定 - 那麼Text仍顯示爲Enabled! :( – 2009-08-13 16:17:03