我有一个扩展器列表,我希望用全局切换按钮控制其扩展状态(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>
答案 0 :(得分:7)
我知道这篇文章很老了。只需将其发布给遇到的其他人。以下代码对我有用。
<Expander IsExpanded="{Binding ElementName=ExpandAll, Path=IsChecked, UpdateSourceTrigger=Explicit}">
</Expander>
当动态生成扩展器时,例如在DataGrid.RowDetailsTemplate
内部。
答案 1 :(得分: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
的{{1}}属性之间设置IsChecked
绑定来实现(即当目标绑定时<绑定将设置与源相对应)价值变化),并使用ToggleButton
将每个IMultiValueConverter
的单个值转换为一个。