20

コンテナとしてListBoxListBoxItem使用するDataTemplateを使用しています。Expander問題は、イベントExpanderを食い尽くしているように見え(正確には一部)、クリックしても取得できないことです(ただし、それ自体をクリックすると機能します)。ClickHeaderSiteExpanderSelectedItemExpanderListBoxItem

Expanderうまく遊ぶ方法について何かアイデアはありListBoxますか?

問題を再現する簡略化されたXamlを次に示します(背後にコードは必要ありません)。

編集コードを更新して実際のテンプレートに近づけましたが、スクリーンショットは以前のリビジョンのもののままです(問題は同じです-これは最初の回答で問題を明確にするためだけです)

<Window x:Class="ListBoxSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <TextBlock>
            <Run Text="Selected Item" />
            <Run Text="{Binding ElementName=ListBox, Path=SelectedItem}" />
        </TextBlock>
        <ListBox x:Name="ListBox">
            <ListBoxItem>
                <Expander Header="Expandable Stuff 1">
                    <ListBox>
                        <ListBoxItem>1.1</ListBoxItem>
                        <ListBoxItem>1.2</ListBoxItem>
                    </ListBox>
                </Expander>
            </ListBoxItem>
            <ListBoxItem>
                <Expander Header="Expandable Stuff 2">
                    <ListBox>
                        <ListBoxItem>2.1</ListBoxItem>
                        <ListBoxItem>2.2</ListBoxItem>
                    </ListBox>
                </Expander>
            </ListBoxItem>
        </ListBox>
    </StackPanel>
</Window>

スクリーンショットは事前編集されています

ListBoxItem結果をクリックするとSelectedItem

<code> ListBoxItem </ code>をクリックすると、<code> SelectedItem</code>が表示されます。

エキスパンダーをクリックしても更新されません(破線のアウトラインで明らかなように、エキスパンダー1をクリックしました)。 SelectedItem

エキスパンダーをクリックしても、<code> SelectedItem</code>は更新されません

4

2 に答える 2

12

コードビハインドなしでこれを行うことができます

<ListBox.ItemContainerStyle>
    <Style>
        <Style.Triggers>
            <EventTrigger RoutedEvent="Control.PreviewMouseLeftButtonDown">
                <BeginStoryboard>
                    <Storyboard Storyboard.TargetProperty="(Selector.IsSelected)">
                        <BooleanAnimationUsingKeyFrames Duration="0:0:0">
                            <DiscreteBooleanKeyFrame Value="True" />
                        </BooleanAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Style.Triggers>
    </Style>
</ListBox.ItemContainerStyle>
于 2013-01-25T13:27:14.093 に答える
7

次のコードは、毎回 Selected アイテムのみが展開されるという欠点 (またはおそらく利点) で動作するようです。

Expander次の 2 つの属性を 2 に適用します。

IsHitTestVisible="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}, Path=IsSelected}"
IsExpanded="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}, Path=IsSelected}"

IsHitTestVisible同様にバインドすることで、Expanderに含まれる要素とやり取りできるようになります。

その結果:

            <ListBox x:Name="ListBox" IsSynchronizedWithCurrentItem="True">
                <ListBoxItem>
                    <Expander Header="Expandable Stuff 1" IsHitTestVisible="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}, Path=IsSelected}" IsExpanded="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}, Path=IsSelected}">
                        1
                    </Expander>
                </ListBoxItem>
                <ListBoxItem>
            <Expander Header="Expandable Stuff 2" IsHitTestVisible="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}, Path=IsSelected}" IsExpanded="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}, Path=IsSelected}">
                        2
                    </Expander>
                </ListBoxItem>
            </ListBox>

コードビハインドを使用した別のソリューションは次のとおりです。

            <ListBox x:Name="ListBox" IsSynchronizedWithCurrentItem="True">
                <ListBoxItem>
                    <Expander Header="Expandable Stuff 1" IsHitTestVisible="False" IsExpanded="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}, Path=IsSelected}">
                <StackPanel IsHitTestVisible="True">
                    <Label Content="1"/>
                </StackPanel>
            </Expander>
                </ListBoxItem>
                <ListBoxItem>
            <Expander Header="Expandable Stuff 2" ButtonBase.Click="Expander_Click_1" Tag="{Binding  RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}}">
                2                     
            </Expander>
                </ListBoxItem>
            </ListBox>

コードビハインド:

    private void Expander_Click_1(object sender, RoutedEventArgs e)
    {
        if (sender is Expander)
        {
            Expander senderExp = (Expander)sender;
            object obj = senderExp.Tag;
            if (obj is ListBoxItem)
            {
                ((ListBoxItem)obj).IsSelected = true;
            }
        }            
    }
于 2013-01-25T13:04:44.563 に答える