在第二个列表视图中选择与第一个列表视图相同

时间:2012-03-15 13:02:08

标签: wpf listview mvvm datatemplate relativesource

我有一个包含2个列表视图的网格。列表视图是相同的(只有itemsource对于c的其他项目是不同的)datatemplate =具有1个Label和另一个网格的Stackpanel。现在,如果选择了项目(标签),我希望网格(在Datatemplate内部的stackpanel内)仅可见。我用这段代码尝试了它(我把它放在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>

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

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

1 个答案:

答案 0 :(得分:1)

仅仅因为ListBox没有焦点,并不意味着一个项目未被选中,我怀疑你有SelectedItemSelectedIndex绑定到同一个属性ListViews使ListViewItem.IsSelected在两个ListView之间同步

我建议让Grid的可见性条件基于2个属性而不是1:ListViewItem.IsSelected为真,如果ListViewItem.IsKeyboardFocusWithin设置为True,则为

以下是使用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