我有一个包含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项网格显示在第一个列表视图!!!!)
我认为这与相关来源有关,但我找到了答案。 希望你们能帮助我。
答案 0 :(得分:1)
仅仅因为ListBox
没有焦点,并不意味着一个项目未被选中,我怀疑你有SelectedItem
或SelectedIndex
绑定到同一个属性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