Wpf如何基于变量动态渲染按钮
本文关键字:按钮 动态 变量 何基于 Wpf | 更新日期: 2023-09-27 18:12:28
如果Url不为空,我希望能够显示超链接,否则我不希望显示链接。
我该怎么做呢?这是我到目前为止的代码。列表框模板示例:<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Background="#CD85C9E9"
Name="spListItem"
Orientation="Horizontal"
HorizontalAlignment="Stretch">
<Label>
<TextBlock Text="{Binding Name}" />
<!-- How to define if Url Is Null -->
<Hyperlink Name="MyLink" Click="MyLink_Click" />
</Label>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
我的类:
public class MyList
{
public string Name{get;set;}
public string? Url{get;set;}
}
两个选项:
-
编写一个自定义值转换器,将对象(在这种情况下是你的Url)转换为基于是否为空的可见性,并设置在你的可见性属性:
-
使用DataTrigger将可见性设置为false
<Hyperlink Name="MyLink" Click="MyLink_Click"> <Hyperlink.Style> <Style TargetType="Hyperlink"> <Style.Triggers> <DataTrigger Binding="{Binding Url}" Value="{x:Null}"> <Setter Property="Visibility" Value="Collapsed"/> </DataTrigger> </Style.Triggers> </Style> </Hyperlink.Style> </Hyperlink>
第二个比较冗长,但是完全可以在xaml中完成。但是,在第一种情况下,您将不止一次地使用自定义转换器。
顺便说一下
public string? Url{get;set;}
String
是一个引用类型,所以已经可以为空。
我建议您遵循MVVM模式,以便所有业务逻辑细节都由ViewModel封装(或者至少将其保存在代码中,而不是复杂的视图触发器等)。
基本上你可以公开属性
public bool IsUrlProvided { get; private set; }
它封装了所有的逻辑,这是正确的URL格式的细节,并在视图中只是绑定可见性到这个标志使用布尔安可视性转换器。
<Button Visibility="{Binding IsUrlProvided,
Converter={StaticResource BooleanToVisibilityConverter}}" />
通过这种方式,您不需要每次都在逻辑更改时更改View