代码之家  ›  专栏  ›  技术社区  ›  Rick Rat

如何在XAML中执行此操作?

  •  2
  • Rick Rat  · 技术社区  · 15 年前

    我想在带有触发器的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 回复  |  直到 9 年前
        1
  •  6
  •   viky    15 年前

    你能告诉我你在XAML中是如何做到这一点的吗?

    在出现此错误消息的情况下,还需要提到类型名以及触发器内的属性。

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

    此外,您似乎在添加触发器 <ListBox.Triggers> 集合,但只能将EventTrigger添加到此集合中。因此,您需要为列表框取消样式声明以添加触发器,而border元素应该在列表框的controlTemplate中,但在您的情况下,border似乎在列表框之外,因此声明样式不是一个解决方案。相反,您应该在ValueConverter(比如IndexToVisibilityConverter)的帮助下使用带有SelectIndex属性的绑定。您需要在codebehind中定义这个转换器,并将其添加到资源中。

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

    选择完全取决于你的要求。

        2
  •  4
  •   Ray Burns    15 年前

    就这么简单:

    <Border x:Name="Border1" ... Visibility="Visible" ... />
    
    ...
    
    <Trigger SourceName="ListBox1" Property="ListBox.SelectedIndex" Value="-1">
      <Setter TargetName="Border1" Property="UIElement.Visibilty" Value="Hidden" />
    </Trigger>
    

    更新

    我从您发布的新代码中看到,您正试图直接在列表框上使用触发器。触发器必须在ControlTemplate中才能使用SourceName。如果您的用户界面完成了“自定义控件”(我的首选项),您将已经有了一个控件模板来放置它。如果没有,可以通过将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>
    

    更好的解决方案可能是使用自定义控件。使用带有转换器的绑定是可能的,但不如优雅的imho。