Вопрос по wpf, binding, controltemplate, xaml, c# – WPF - привязать видимость UserControl к свойству

15

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

Я создал 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   ответа
28

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

Вот хороший пример:http: //jeffhandley.com/archive/2008/10/27/binding-converters---visibilityconverter.asp

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>
Спасибо, именно то, что я искал! Кроме того, UserControl наследует DataContext от Grid? Можно ли создать привязку на самом UserContro Martin
Да, UserControl будет иметь тот же DataContext, что и Grid. Из-за этого вы можете без проблем поместить привязку видимости в UserControl. davisoa
Небольшое примечание: замените BooleanToVisibiltyConverter на BooleanToVisibilityConverter (добавьте пропущенное «i»), и оно будет выглядеть так: <BooleanToVisibilityConverter x: Key = «myBoolToVisibilityConverter» /> Kaitnieks
Спасибо, что заметили! Я обновил ответ. davisoa
0
Используйте .NET встроенный конвертер

. BooleanToVisibilityConverter.

(Примечание: может быть доступно не на всех платформах, например, для мобильных устройств)

Сначала добавьте его в свои ресурсы

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

Затем используйте его на элементе

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

Как мне инвертировать BooleanToVisibilityConverter?

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

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

Похожие вопросы