我如何在XAML中执行此操作?

时间:2009-12-27 05:34:48

标签: wpf xaml wpf-controls

我想在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>

2 个答案:

答案 0 :(得分:6)

你能告诉我你是怎么在xaml中这样做的吗?

如果出现此错误消息,您还需要提及类型名称以及触发器内的属性。

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

此外,您似乎在<ListBox.Triggers>集合中添加了触发器,但您只能将EventTrigger添加到此集合中。所以你需要为ListBox设置一个Style来为它添加一个Trigger,你的Border元素应该在ListBox的ControlTemplate中,但在你的情况下,Border似乎在ListBox之外,所以声明一个样式将不是一个解决方案。相反,你应该在ValueConverter的帮助下使用Binding with SelectIndex属性(比如IndexToVisibilityConverter)。您需要在代码隐藏中定义此转换器并将其添加到资源中。

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

完全符合您的要求。

答案 1 :(得分:4)

就这么简单:

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

...

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

<强>更新

我从您发布的新代码中看到,您正试图直接在ListBox上使用触发器。触发器必须位于ControlTemplate中才能使用SourceName。如果您的UI使用“自定义控件”(我的首选项)完成,您将已经有一个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>

更好的解决方案可能是使用自定义控件。使用与转换器的绑定是可能的,但不是那么优雅恕我直言。