2012-04-03 39 views
5

什麼是最簡單的方法使ToggleButton內容取決於它的檢查狀態?取決於其選中狀態的ToggleButton/CheckBox內容?

在WPF我可能會去一個DataTrigger,它不存在於Silverlight中。

我嘗試了以下方法,但它不起作用,只要我包含觸發器,就會破壞對源的綁定。無論如何,觸發器都無法工作。

<ToggleButton 
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
IsChecked="{Binding IsArchived, Mode=TwoWay}"> 
    <i:Interaction.Triggers> 
    <i:EventTrigger EventName="Checked"> 
     <ei:ChangePropertyAction 
     TargetObject="{Binding 
     RelativeSource={RelativeSource AncestorType=ToggleButton}}" 
     PropertyName="Content" Value="Unarchive project"/> 
    </i:EventTrigger> 
    <i:EventTrigger EventName="Unchecked"> 
     <ei:ChangePropertyAction 
     TargetObject="{Binding 
     RelativeSource={RelativeSource AncestorType=ToggleButton}}" 
     PropertyName="Content" Value="Archive project"/> 
    </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ToggleButton> 
+0

我自己的方式沒有資格作爲短,所以我張貼作爲評論:覆蓋切換按鈕模板,使用兩個文本框,使用設置其可見性屬性VisualStateManager。 – jv42 2012-04-04 08:53:07

+0

@ jv42,這不會影響第一次綁定的控件,只有在渲染後更改時,請參閱[我的答案](http://stackoverflow.com/a/9989048/75500),它也解決了這個問題。 – Shimmy 2012-04-04 09:03:33

+0

我從來沒有遇到過問題。也許我錯過了什麼。 – jv42 2012-04-04 09:11:27

回答

4
<ToggleButton Width="50" Height="50"> 
    <ToggleButton.Content> 
     <TextBlock x:Name="obj" Text="Foo"/> 
    </ToggleButton.Content> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Checked"> 
      <ei:ChangePropertyAction PropertyName="Text" Value="On" TargetName="obj"/> 
     </i:EventTrigger> 
     <i:EventTrigger EventName="Unchecked"> 
      <ei:ChangePropertyAction PropertyName="Text" Value="Off" TargetName="obj"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ToggleButton> 
+0

我看了一下ChangePropertyAction源代碼,它使用了TypeConverter和反射SetValue的組合,不知怎的,它混淆了內容是Object並且你設置了String的事實,所以我決定不花費時間以詳細瞭解此代碼) – 2012-04-03 04:16:54

1

我結束了使用Kent Boogaartconverter,偉大工程,也是依賴於綁定屬性,而不是一個控制觸發這可能不是在所有的火(在的情況下財產WASN 「T實際設置),這裏是代碼:

<ToggleButton.Content> 
    <Binding Path="IsArchived" 
    xmlns:boo="http://schemas.kent.boogaart.com/converters" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
    <Binding.Converter> 
     <boo:MapConverter> 
     <boo:Mapping To="Archive project"> 
      <boo:Mapping.From> 
      <sys:Boolean>false</sys:Boolean> 
      </boo:Mapping.From> 
     </boo:Mapping> 
     <boo:Mapping To="Unarchive project"> 
      <boo:Mapping.From> 
      <sys:Boolean>true</sys:Boolean> 
      </boo:Mapping.From> 
     </boo:Mapping> 
     </boo:MapConverter> 
    </Binding.Converter> 
    </Binding> 
</ToggleButton.Content> 
+0

我個人將此LOGIC放在viewModel中,而不是在XAML中進行挖掘。它代碼少,它使你的內容可見。我討厭閱讀我的隊友XAML在裏面尋找隱藏的邏輯。但是,如果你一個人工作就沒問題了。 – 2012-04-04 04:22:47

+0

@AlexBurtsev我不同意。這是View層的問題,而不是ViewModel的問題,誰的職責就是暴露一個IsArchived屬性,並保持UI不可知。 – Shimmy 2012-04-04 04:29:29

+1

它可以是任何方式,取決於您對VM模式的使用情況。這是一個轉換器存在於XAML或VM中的問題,我更喜歡第二個轉換器,當VM提供準備好使用數據的視圖時。部分原因是因爲「外部」轉換器功能通常有限。 – 2012-04-04 04:46:11