2012-03-15 5 views
0

У меня есть сетка с 2 списками в ней. Перечни одинаковы (только для других элементов ofc) используется только источник данных. Datatemplate = Stackpanel, в котором есть 1 ярлык и другая сетка. Теперь я хочу, чтобы сетка (внутри панели стека, которая находится внутри Datatemplate) ТОЛЬКО была видимой, если элемент выбран (метка). Я пробовал с этим кодом (который я поставил в DataTemplate в Listview:isselected во втором списке, как на первом

<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> 

Это работает ОДНАКО, если выбрать элемент в 2 ListView (и только 2-й), то первый один также показывает, что сетка (на том же уровне элемента). (Так, например, во втором списке я выбираю 3-й элемент (метку), тогда сетка отображается на 3-м элементе второго списка, но сетка 3-го элемента отображается на первый ListView !!!!)

Думаю, это связано с относительной исходной вещи, но я coudn т найти ответ. Надеюсь, что вы, ребята, можете помочь мне.

ответ

1

Просто потому, что ListBox не имеет фокуса, не означает, что элемент становится невыбранным, и я подозреваю, что у вас есть SelectedItem или SelectedIndex связан с тем же свойством и в ListViews, который делая ListViewItem.IsSelected синхронизируется между два ListViews

Я предлагаю сделать условие видимости вашего грида основано на 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

+0

Постараюсь в этот раз я иди домой. Думаю, ты будешь моим героем снова Рейчел №1! : D – Maximc

+0

oke it works, рядом, теперь, если я нажимаю на элемент списка, теперь закрывается другой объект списка, который был открыт (теперь была видна сетка). Есть ли способ исправить это, возможно? – Maximc

+0

@Maximc Если вы хотите сохранить видимую 'Grid' для выбранного элемента, я бы использовал' IsSelected' вместо 'IsKeyboardFocusWithin', и убедитесь, что вы привязываете' SelectedItem' или 'SelectedIndex' вашего ListViews к двум различным значениям , Похоже, что они привязаны к одному и тому же значению, поэтому выбор синхронизируется. – Rachel

Смежные вопросы

 Смежные вопросы