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;}
}

Wpf如何基于变量动态渲染按钮

两个选项:

  1. 编写一个自定义值转换器,将对象(在这种情况下是你的Url)转换为基于是否为空的可见性,并设置在你的可见性属性:

  2. 使用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