展开/折叠所有扩展器
问题描述:
我有一个扩展器的列表,我想控制其展开状态(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>
答
我不认为你可以做到这一点完全在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
的一个值。
答
我知道这个帖子很旧。只要发布给遇到任何其他人。以下代码适用于我。
<Expander IsExpanded="{Binding ElementName=ExpandAll, Path=IsChecked, UpdateSourceTrigger=Explicit}">
</Expander>
这适用于扩展器是动态生成的,例如在DataGrid.RowDetailsTemplate
的内部。
+0
太棒了!谢谢!! – lightxx 2012-05-09 10:02:27
嗨,史蒂夫,那有效。你知道如果这个解决方案可以修改,如果扩展器werent修复并由ItemsControl生成? – Pradeep 2010-11-09 12:31:10
@Pradeep - 不,我不认为使用这种方法是可能的,因为'MultiBinding'需要一个'Binding'的具体列表。如果这是必需的,那么你可能需要考虑实现一个视图模型或(神禁止)一些代码 – 2010-11-09 13:08:16
@Steve Greatrex:在我们手动展开/折叠之后,OP问题中的绑定是什么破坏? WPF4中有没有比这里更好的方法?任何意见? – VoodooChild 2011-10-10 22:45:45