我有一个带有一些模板的列表框。组由扩展器表示。列表框链接到文件系统,每个文件夹都有自己的扩展器。无论何时重命名,删除等文件,都会刷新列表框的视图。这很好用但是一旦调用刷新,每个扩展器都会崩溃。我似乎无法找到一个让它们保持开放的好方法。我看到另一个问题,使用绑定来解决单个扩展器的问题。 “IsExpanded”上的数据绑定问题是,存在未知数量的扩展器,我无法知道在设计时将会有多少扩展器,它们将被调用等等。有什么想法吗?
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander VerticalAlignment="Top"
OverridesDefaultStyle="True"
Template="{StaticResource SimpleExpanderTemp}">
<Expander.Header>
<TextBlock VerticalAlignment="Center"
Background="Transparent"
Text="{Binding Path=Name}"
FontFamily="SegoeUI"
FontSize="16"
Foreground="Black"/>
</Expander.Header>
<Expander.Tag>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0.0" Color="#696969" />
<GradientStop Offset="1.0" Color="#474747" />
</LinearGradientBrush>
</Expander.Tag>
<ItemsPresenter/>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</ListBox.GroupStyle>
答案 0 :(得分:3)
一种可能的解决方案是仍然在IsExpanded属性上使用数据绑定。
不是绑定到布尔值,而是绑定到布尔值列表,并使用ValueConverter从列表中检索适当的项目。
创建所有扩展器时,如果您还没有,请为每个扩展器指定一个索引号。然后,在绑定IsExpanded属性时,设置Converter,并将converter参数设置为扩展器的索引号。然后你的转换器将接收布尔值列表作为'value'参数,索引号作为'parameter'参数,然后你的转换器可以返回一个布尔值。
您的转换器可能如下所示:
public class ListToBooleanConverter : IValueConverter
{
public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if ((value != null) & (parameter != null)) {
try {
Int16 itmNum = Convert.ToInt32(parameter);
List<bool> lst = value;
return lst[itmNum];
} catch (Exception ex) {
return null;
}
}
return null;
}
public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException("This method or operation is not implemented.");
}
}
在XAML中,此数据绑定和转换器的实现看起来像这样(对于索引号为5的扩展器):
IsExpanded="{Binding Path=ListIsExpanded, Converter={StaticResource ListToBooleanConverter}, ConverterParameter=5}">
显然,在代码中,这种实现看起来会有所不同。