2009-12-27 3 views
2

Я хочу сделать это в XAML с помощью триггера, как мне это сделать?Как это сделать в XAML?

If ListBox1.SelectedIndex > -1 Then 
     Border1.Visibility = Windows.Visibility.Visible 
    Else 
     Border1.Visibility = Windows.Visibility.Hidden 
    End If 

Этот код XAML НЕ работает. SelectedIndex член недействителен, так как он не имеет имени квалификационного типа.

  <ListBox.Triggers> 
       <Trigger SourceName="ListBox1" Property="SelectedIndex" Value="False"> 
        <Setter TargetName="Border1" Property="Visibilty" Value="Hidden" /> 
       </Trigger> 
      </ListBox.Triggers> 

ответ

6

Можете ли вы показать мне, как вы пытаетесь это сделать в xaml?

В случае возникновения этого сообщения об ошибке вам необходимо указать имя типа также со свойством внутри триггера.

<Trigger SourceName="ListBox1" Property="ComboBox.SelectedIndex" Value="-1"> 
    <Setter TargetName="Border1" Property="Border.Visibility" Value="Hidden" /> 
</Trigger> 

Кроме того, кажется, что вы добавляете Trigger в <ListBox.Triggers> коллекции, но вы можете добавить EventTrigger в этой коллекции. Поэтому вам нужно объявить стиль для вашего ListBox для добавления триггера для этого, и ваш элемент Border должен находиться внутри ControlTemplate ListBox, но в вашем случае граница кажется вне ListBox, поэтому объявление стиля не будет решением. Вместо этого вы должны использовать свойство Binding with SelectIndex с помощью ValueConverter (например, IndexToVisibilityConverter). Вы должны определить этот конвертер в коде и добавить его в ресурсы.

<Border Visibility={Binding Path=SelectedIndex, ElementName=ListBox1, Converter={StaticResource IndexToVisibilityConverter}}/> 

Выбор полностью соответствует вашим требованиям.

+0

Это похоже на путь больше ... –

+0

Это то, что мне нужно ... И это сработало, спасибо! –

4

Это так просто, как это:

<Border x:Name="Border1" ... Visibility="Visible" ... /> 

... 

<Trigger SourceName="ListBox1" Property="ListBox.SelectedIndex" Value="-1"> 
    <Setter TargetName="Border1" Property="UIElement.Visibilty" Value="Hidden" /> 
</Trigger> 

Update

Я вижу от нового кода вы публикуемую, что вы пытаетесь использовать триггер непосредственно на ListBox. Триггер должен находиться в ControlTemplate для использования SourceName. Если ваш пользовательский интерфейс выполнен с помощью «пользовательских элементов управления» (мои предпочтения), у вас уже будет элемент управления ControlTemplate. Если нет, вы можете легко добавить его, обернув свой XAML в общий «ContentControl» (базовый класс, а не любой подкласс) и установив его шаблон, например:

<Window ...> 
    ... 

    <ContentControl> 
    <ContentControl.Template> 
     <ControlTemplate TargetType="{x:Type ContentControl}"> 

     <Grid> 
      ... 
      <ListBox x:Name="ListBox1" ... /> 
      ... 
      <Border x:Name="Border1"> 
      ... 
      </Border> 
     </Grid> 

     <ControlTemplate.Triggers> 
      <Trigger SourceName="ListBox1" Property="ListBox.SelectedIndex" Value="-1"> 
      <Setter TargetName="Border1" Property="UIElement.Visibility" Value="Hidden" /> 
      </Trigger> 
     </ControlTemplate.Triggers> 

     </ControlTemplate> 
    </ContentControl.Template> 

    </ContentControl> 
    ... 
</Window> 

Лучшим решением, вероятно, будет использование пользовательских элементов управления. Использование связывания с конвертером возможно, но не так элегантно ИМХО.

+0

Я получаю сообщение об ошибке: член «SelectedIndex» недействителен, так как он не имеет имени квалификационного типа. –

+0

Поскольку Trigger не находится в ControlTemplate/DataTemplate для ListBox, необходимо квалифицировать имя свойства ('Property =" ListBox.SelectedIndex "'). Я обновил свой ответ. –

+0

Также обратите внимание, что триггер должен использоваться на вашем ControlTemplate/DataTemplate, а не непосредственно в ListBox. Если вы не используете ControlTemplates, вы можете добавить общий элемент управления, содержащий ContentPresenter. –