WPF - 将UserControl的可见性绑定到属性

时间:2012-05-15 19:32:24

标签: c# wpf xaml binding controltemplate

我有一个绑定到ObservableCollection的ListView。数据从Internet加载,然后添加到集合中。下载需要几秒钟,我想指示用户数据正在加载。

我创建了一个表示活动的UserControl。我将它放在ControlTemplate中。

<ControlTemplate x:Key="ListViewControlTemplate1" TargetType="{x:Type ListView}">
    <Grid>
        <local:ActivityIndicatorControl 
            HorizontalAlignment="Center" 
            Height="Auto" 
            Margin="0" 
            VerticalAlignment="Center"/>
    </Grid>
</ControlTemplate>

我想将ActivityIndicatorControl的可见性绑定到属性,让我们说bool IsLoading并将其设置为Visible / Collapsed。

谢谢!

2 个答案:

答案 0 :(得分:28)

我建议使用IValueConverter接受您的布尔值,并返回Visibility枚举的成员。

以下是一个很好的例子:http://jeffhandley.com/archive/2008/10/27/binding-converters---visibilityconverter.aspx

XAML看起来像这样:

首先为转换器定义资源(将其放在资源字典中):

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

然后像这样更改模板:

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

答案 1 :(得分:0)

使用.NET的内置转换器

.NET 3内置BooleanToVisibilityConverter

(注意:可能并非在所有平台上都可用,例如:移动设备)

首先将其添加到您的资源

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

然后在元素

上使用它
<Label Visibility="{Binding IsSomeProperty, Converter={StaticResource bool2vis}}" />

反相

How do I invert BooleanToVisibilityConverter?

如果要反转转换器(例如:当属性为true时隐藏元素),此答案具有IValueConverter的自定义实现,通过XAML支持

<Application.Resources>
    <app:BooleanToVisibilityConverter 
        x:Key="BooleanToVisibilityConverter" 
        True="Collapsed" 
        False="Visible" />
</Application.Resources>