4

我有一个带有一些模板的列表框。组由扩展器表示。列表框链接到文件系统,每个文件夹都有自己的扩展器。任何时候重命名、删除文件等,都会刷新列表框的视图。这很好用,但是一旦调用了刷新,每个扩展器都会崩溃。我似乎找不到让它们保持开放的好方法。我看到另一个使用绑定来解决单个扩展器的问题。“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>
4

1 回答 1

3

一种可能的解决方案是仍然在 IsExpanded 属性上使用数据绑定。

不是绑定到布尔值,而是绑定到布尔值列表并使用 ValueConverter 从列表中检索适当的项目。

创建所有扩展器时,如果还没有,请给每个扩展器一个索引号。然后在绑定 IsExpanded 属性时,设置 Converter,并将转换器参数设置为扩展器的索引号。然后您的转换器将接收布尔值列表作为“值”参数和索引号作为“参数”参数,然后您的转换器可以返回一个布尔值。

您的转换器可能如下所示:

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}">

显然,在代码中,这个实现看起来会有些不同。

于 2012-07-24T18:25:40.087 回答