0

我有一个网格,里面有 2 个列表视图。列表视图是相同的(只有 itemsource 与 c 的其他项目不同)datatemplate = Stackpanel 具有 1 个标签和另一个网格。现在我希望网格(在数据模板内的堆栈面板内)只有在选中项目(标签)时才可见。我用这段代码试了一下(我把它放在 Listview 的数据模板中:

<StackPanel>
<Label content={binding blabla} />
<Grid Visibility="{Binding IsSelected,RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}, Mode=FindAncestor}, Mode=OneWay,  Converter={StaticResource BooleanToVisibilityConverter}}" >
...random labels etc...
</Gird>
</StackPanel>

这行得通!但是,如果我在第二个列表视图中选择一个项目(并且只有第二个),那么第一个也显示该网格(在同一“项目级别”上)。(例如,在第二个列表视图中,我选择第三个项目(标签),然后网格显示在第二个列表视图的第三个项目上,但第三个项目网格显示在第一个列表视图上!!!)

我认为这与相对来源有关,但我找不到答案。希望你们能帮帮我。

4

1 回答 1

1

仅仅因为 aListBox没有焦点,并不意味着一个项目被取消选择,我怀疑你有SelectedItemorSelectedIndex绑定到相同的属性,ListViews这使得ListViewItem.IsSelected两个 ListViews 之间同步

我建议使您的网格的可见性条件基于 2 个属性而不是 1:ListViewItem.IsSelected为真,并且如果ListViewItem.IsKeyboardFocusWithin设置为真。

这是一个使用DataTrigger

<Style TargetType="{x:Type Grid}" x:Key="GridStyle">
    <Setter Property="Visibility" Value="Collapsed" />
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Value="True" Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}}" />
                <Condition Value="True" Binding="{Binding Path=IsKeyboardFocusWithin, RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}}" />
            </MultiDataTrigger.Conditions>
            <Setter Property="Visibility" Value="Visible" />
        </MultiDataTrigger>
    </Style.Triggers>
</Style>

实际上回想起来,我认为IsKeyboardFocusWithin会将项目设置为选中,所以也许你只需要使用IsKeyboardFocusWithin而不是IsSelected

于 2012-03-15T13:23:34.273 回答