2012-05-15 6 views
15

У меня есть ListView, связанный с ObservableCollection. Данные загружаются из Интернета, а затем добавляются в коллекцию. Загрузка занимает несколько секунд, и я хочу указать пользователю, что данные загружаются.WPF - привязать видимость UserControl к свойству

Я создал 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/Рухнул соответственно.

Спасибо!

ответ

28

Я бы рекомендовал использовать IValueConverter, чтобы принять ваше логическое значение и вернуть член перечисления видимости.

Вот хороший пример одного: 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> 
+0

Спасибо, именно то, что я искал ! Кроме того, UserControl наследует DataContext от Grid? Можно ли создать привязку в самом UserControl? – Martin

+1

Да, UserControl будет иметь тот же DataContext, что и Grid. Из-за этого вы можете установить привязку видимости в UserControl без проблем. – davisoa

+0

Небольшое примечание: измените BooleanToVisibiltyConverter на BooleanToVisibilityConverter (добавьте отсутствующий «i»), и он выглядит так: Kaitnieks

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?

Если вы хотите, чтобы инвертировать конвертер (например: скрыть элемент, когда ваше свойство истинно), этот ответ имеет пользовательские реализации IValueConverter, который поддерживает, что с помощью XAML

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