WPF - Bind UserControl visibility to a property

前端 未结 2 2040
暖寄归人
暖寄归人 2021-01-04 02:41

I have a ListView bound to ObservableCollection. Data are loaded from the internet and then added to collection. The download takes few seconds and I want to indicate user t

相关标签:
2条回答
  • 2021-01-04 03:24

    Use .NET's built in Converter

    .NET 3 has a built in BooleanToVisibilityConverter.

    (Note: May not be available on all platforms, ex: mobile)

    First add it to your Resources

    <UserControl.Resources>
        <BooleanToVisibilityConverter x:Key="bool2vis"></BooleanToVisibilityConverter>
    </UserControl.Resources>
    

    Then use it on an element

    <Label Visibility="{Binding IsSomeProperty, Converter={StaticResource bool2vis}}" />
    

    Inverting

    How do I invert BooleanToVisibilityConverter?

    If you want to invert the converter (ex: hide the element when your property is true), this answer has a custom implementation of IValueConverter that supports that via XAML

    <Application.Resources>
        <app:BooleanToVisibilityConverter 
            x:Key="BooleanToVisibilityConverter" 
            True="Collapsed" 
            False="Visible" />
    </Application.Resources>
    
    0 讨论(0)
  • 2021-01-04 03:26

    I would recommend using a IValueConverter to accept your boolean, and return a member of Visibility enumeration.

    Here is a good example of one: http://jeffhandley.com/archive/2008/10/27/binding-converters---visibilityconverter.aspx

    The XAML would look like this:

    First you define a resource for the converter (put this in a resource dictionary):

    <local:BooleanToVisibilityConverter x:Key="myBoolToVisibilityConverter" />
    

    And then change your template like this:

    <ControlTemplate x:Key="ListViewControlTemplate1" TargetType="{x:Type ListView}">
        <Grid Visibility="{Binding IsLoading, Converter={StaticResource myBoolToVisibilityConverter}}">
            <local:ActivityIndicatorControl 
                HorizontalAlignment="Center" 
                Height="Auto" 
                Margin="0" 
                VerticalAlignment="Center"/>
        </Grid>
    </ControlTemplate>
    
    0 讨论(0)
提交回复
热议问题