2010-11-09 185 views
3

我有一个扩展器的列表,我想控制其展开状态(IsExpanded),并带有全局切换按钮,该按钮应该在展开/折叠状态之间切换。展开/折叠所有扩展器

到目前为止我所得到的解决方案是通过将扩展器的IsExpanded状态绑定到togglebutton的IsChecked状态来实现的。这工作只要我不手动不切换扩展器。一旦我这样做,那些特定的扩展器不会尊重绑定(切换按钮的IsChecked状态)。

任何想法为什么? XAML有没有一个干净的解决方案?

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
    <StackPanel> 
    <ToggleButton Name="ExpandAll">Toggle</ToggleButton> 
    <Expander IsExpanded="{Binding ElementName=ExpandAll,Path=IsChecked, Mode=OneWay}"> 
     Hai 
    </Expander> 
    <Expander IsExpanded="{Binding ElementName=ExpandAll,Path=IsChecked, Mode=OneWay}"> 
     Hello 
    </Expander> 
    <Expander IsExpanded="{Binding ElementName=ExpandAll,Path=IsChecked, Mode=OneWay}"> 
     Weird 
    </Expander> 
    </StackPanel> 
    </Grid> 
</Page> 

回答

2

我不认为你可以做到这一点完全在XAML,但下面让你与IValueConverter做到这一点:

<StackPanel> 
     <StackPanel.Resources> 
      <local:Converter x:Key="Converter" /> 
     </StackPanel.Resources> 
     <ToggleButton Name="ExpandAll"> 
      <ToggleButton.IsChecked> 
       <MultiBinding Mode="OneWayToSource" Converter="{StaticResource Converter}"> 
        <Binding ElementName="Expander1" Path="IsExpanded" /> 
        <Binding ElementName="Expander2" Path="IsExpanded" /> 
        <Binding ElementName="Expander3" Path="IsExpanded" /> 
       </MultiBinding> 
      </ToggleButton.IsChecked> 
      Toggle</ToggleButton> 
     <Expander Name="Expander1"> 
      Hai 
     </Expander> 
     <Expander Name="Expander2"> 
      Hello 
     </Expander> 
     <Expander Name="Expander3"> 
      Weird 
     </Expander> 
    </StackPanel> 

和你Converter是如下:

public class Converter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     //we're using OneWayToSource, so this will never be used. 
     return DependencyProperty.UnsetValue; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     // we want to convert the single 'IsChecked' value from the ToggleButton into 
     // 3 'IsExpanded' values 
     var allValues = new object[targetTypes.Length]; 
     for (int i = 0; i < allValues.Length; i++) 
     { 
      allValues[i] = value; 
     } 

     return allValues; 
    } 
} 

这项工作通过设置OneWayToSource之间的结合IsChecked属性ToggleButton(即当目标值改变时,绑定将为,针对源设置),并且使用IMultiValueConverter将单个值转换为用于每个Expander的一个值。

+0

嗨,史蒂夫,那有效。你知道如果这个解决方案可以修改,如果扩展器werent修复并由ItemsControl生成? – Pradeep 2010-11-09 12:31:10

+0

@Pradeep - 不,我不认为使用这种方法是可能的,因为'MultiBinding'需要一个'Binding'的具体列表。如果这是必需的,那么你可能需要考虑实现一个视图模型或(神禁止)一些代码 – 2010-11-09 13:08:16

+0

@Steve Greatrex:在我们手动展开/折叠之后,OP问题中的绑定是什么破坏? WPF4中有没有比这里更好的方法?任何意见? – VoodooChild 2011-10-10 22:45:45

7

我知道这个帖子很旧。只要发布给遇到任何其他人。以下代码适用于我。

<Expander IsExpanded="{Binding ElementName=ExpandAll, Path=IsChecked, UpdateSourceTrigger=Explicit}"> 
</Expander> 

这适用于扩展器是动态生成的,例如在DataGrid.RowDetailsTemplate的内部。

+0

太棒了!谢谢!! – lightxx 2012-05-09 10:02:27