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

考えられる解決策の 1 つは、IsExpanded プロパティで引き続きデータ バインディングを使用することです。

ブール値にバインドする代わりに、ブール値のリストにバインドし、ValueConverter を使用してリストから適切なアイテムを取得します。

すべてのエキスパンダーを作成するときに、まだインデックス番号を付けていない場合は、それぞれにインデックス番号を付けます。次に、IsExpanded プロパティをバインドするときに、コンバーターを設定し、コンバーター パラメーターをエキスパンダーのインデックス番号に設定します。次に、コンバーターはブール値のリストを「値」引数として受け取り、インデックス番号を「パラメーター」引数として受け取り、コンバーターはブール値を返すことができます。

コンバーターは次のようになります。

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 に答える