2010-11-09 186 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