2011-05-16 26 views
2

我想知道如果我可以綁定我的按鈕isEnabled到我的StackPanel兒童(有子女)。如果堆疊面板有孩子,那麼我的按鈕被啓用,沒有孩子我的按鈕被禁用。目前我只是在代碼中處理這個問題,但我開始想知道這是否是我可以綁定的東西。感謝您的任何想法...綁定按鈕被啓用到StackPanel有孩子

回答

5

事實上,因爲你對付一個布爾值,你可以顛倒邏輯和做沒有轉換器:

<StackPanel Name="sp" /> 
<Button Content="A Button"> 
    <Button.Style> 
     <Style TargetType="{x:Type Button}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=sp, Path=Children.Count}" Value="0"> 
        <Setter Property="IsEnabled" Value="False"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 

利用這一點,你在獲得更新方面遇到了一些問題,因爲Children.Count是不是一個DP,可以使用ItemsControl但要解決這個問題(它幾乎表現得像StackPanel默認):

<ItemsControl Name="ic" /> 
<Button Content="A Button"> 
    <Button.Style> 
     <Style TargetType="{x:Type Button}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=ic, Path=Items.Count}" Value="0"> 
        <Setter Property="IsEnabled" Value="False"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 
+0

這是非常酷,謝謝! – Terco 2011-05-16 23:03:30

+0

很高興幫助:) – 2011-05-16 23:08:40

2

你可以寫一個簡單的ValueConverter爲你做這個邏輯。將Button的IsEnabled綁定到StackPanel,並在你的值轉換器中檢查它是否有子節點,然後返回true/false。

+0

這可能是最簡單的方法來完成它,但我不知道當你將子項添加到堆棧面板時它會更新嗎? – Tim 2011-05-16 21:05:17

+0

首先,我會直接綁定到孩子。但是,兒童不是一個依賴屬性,所以它不會更新,因爲沒有任何通知有任何變化:(所以你必須手動觸發更新。 – 2011-05-17 07:12:02

0

一個簡單的解決方案(無需ItemsPanel)比HB的可能被綁定到ActualHeightStackPanel的財產,因爲如果沒有子女在場,它的大小將爲0。

<Style.Triggers> 
    <DataTrigger Binding="{Binding ElementName=sp, Path=ActualHeight}" Value="0"> 
    <Setter Property="IsEnabled" Value="False"/> 
    </DataTrigger> 
</Style.Triggers> 

您可能需要使用VerticalAlignment="Top"StackPanel,如果它不能正常收縮。