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

时间:2011-10-27 09:52:16

标签: c# wpf xaml

如果Url不为null,我希望能够显示超链接,否则我不希望显示该链接。

我该如何解决这个问题?到目前为止,这是我的代码。我的列表框模板示例:

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

2 个答案:

答案 0 :(得分:3)

两个选项:

  1. 编写自定义值转换器,将对象(在本例中为您的Url)转换为可见性,具体取决于它是否为null,并在Visibility属性上设置它:

  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>
    
  3. 第二个更冗长,但可以完全用xaml完成。但是,在第一种情况下,您将不止一次使用自定义转换器。

    顺便说一下

    public string? Url{get;set;}
    

    String是一个引用类型,因此已经可以为空了。

答案 1 :(得分:1)

我建议您遵循MVVM模式,以便所有业务逻辑细节都由ViewModel封装(或者至少将其保留在代码中而不是复杂的View触发器等)。

所以基本上你可以公开属性

public bool IsUrlProvided { get; private set; }

它封装了所有知道正确URL格式详细信息的逻辑,并且在View中只是将Visibility绑定到此标志usng BooleanToVisibilityConverter。

<Button Visibility="{Binding IsUrlProvided, 
                    Converter={StaticResource BooleanToVisibilityConverter}}" />

这样,每次逻辑更改时都不需要更改视图