2012-04-03 41 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