我想在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>
答案 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>
更好的解决方案可能是使用自定义控件。使用与转换器的绑定是可能的,但不是那么优雅恕我直言。