Возникли проблемы с привязкой видимости ContentPresenter в WPF - PullRequest
1 голос
/ 03 сентября 2010

У меня есть следующий XAML:

<UserControl.Resources>

<DataTemplate x:Key="ExpanderTemplate">
    <Grid>
        <Rectangle Stroke="Black" StrokeThickness="1" Width="10" Height="10" Fill="White" />
        <Rectangle Stroke="Black" StrokeThickness="1" Width="6" Height="1" Fill="Black" />
        <Rectangle Stroke="Black" StrokeThickness="3" Width="2" Height="6" Fill="Black" />
    </Grid>
</DataTemplate>

<DataTemplate x:Key="CollapserTemplate">
    <Grid>
        <Rectangle Stroke="Black" StrokeThickness="1" Width="10" Height="10" Fill="White" />
        <Rectangle Stroke="Black" StrokeThickness="1" Width="6" Height="1" Fill="Black" />
    </Grid>
</DataTemplate>

</UserControl.Resources>

<Grid>
<StackPanel Orientation="Horizontal">
    <TextBlock Text="{Binding Path=Name}" />
    <Grid>
        <ContentPresenter x:Name="ExpanderPresenter" ContentTemplate="{StaticResource ExpanderTemplate}" Visibility="{Binding ExpanderVisibility}" />
        <ContentPresenter x:Name="CollapserPresenter" ContentTemplate="{StaticResource CollapserTemplate}" Visibility="{Binding CollapserVisibility}" />
    </Grid>
</StackPanel>
</Grid>

Как вы можете видеть, это, по сути, текстовый блок, содержимое которого связано с именем, и два объекта contentpresenters, видимость которых связана с парой объектов Visibility в исходном классе. Исходный класс выглядит так:

public class MyViewModel
{
public string Name { get; set; }

public Visibility CollapserVisibility
{
    get
    {
        if (IsExpandable && IsExpanded)
        {
            return Visibility.Visible;
        }
        else
        {
            return Visibility.Collapsed;
        }
    }
}

public Visibility ExpanderVisibility
{
    get
    {
        if (IsExpandable && !IsExpanded)
        {
            return Visibility.Visible;
        }
        else
        {
            return Visibility.Collapsed;
        }
    }
}

public bool IsExpanded { get; set; }
public bool IsExpandable { get; set; }
}

Проблема, с которой я сталкиваюсь, заключается в том, что привязки с объектами видимости никогда не происходят. Связывание со строкой имени происходит , и я проверил это (как визуально, так и расширив и поместив точку останова в геттер), но когда я ставил точки останова в геттеры объектов CollapserVisibility и ExpanderVisibility эти контрольные точки никогда даже не получают удар. Почему это? Я также не получаю никаких ошибок привязки в окне вывода Visual Studio, что еще больше сбивает меня с толку, поэтому он действует так, как будто привязка установлена ​​правильно.

Разрешено ли мне связывать свойство Visibility ContentPresenter? Я также попытался переместить привязки видимости на объекты «Grid» в шаблонах данных (в XAML), но безрезультатно ... это не сработало.

Что не так с моим переплетом? Спасибо за любую помощь.

Ответы [ 3 ]

9 голосов
/ 03 сентября 2010

Если вы измените ContentPresenter на ContentControl, он будет работать (поскольку он привязывается к вашим свойствам видимости - я игнорирую тот факт, что ваша виртуальная машина не уведомляет об изменениях):

<ContentControl x:Name="ExpanderPresenter" ContentTemplate="{StaticResource ExpanderTemplate}" Visibility="{Binding ExpanderVisibility}" />
<ContentControl x:Name="CollapserPresenter" ContentTemplate="{StaticResource CollapserTemplate}" Visibility="{Binding CollapserVisibility}" />

Я действительно не могу объяснить, почему это, кроме того факта, что ContentPresenter предполагается использовать в шаблоне ContentControl.Но для меня это все еще должно работать.Я думаю, что это потребовало бы некоторого базирующегося на Отражателе снайпера, чтобы понять это.

1 голос
/ 03 сентября 2010

Вы когда-нибудь помещали какой-либо контент в contentpresenter?Это может ничего не показывать, потому что нечего показывать.Таблица данных определяет, как должны выглядеть данные, но вам нужно сначала поместить в них данные.

Кроме того, привязки выглядят так, как будто они должны работать для начальных значений, но они не будут обновляться, еслиСвойства IsExpandable или IsExpanded изменились.

Возможно, вам было бы намного лучше использовать MultiDataTrigger для управления видимостью.

0 голосов
/ 16 октября 2015

Очевидно, что это не ваш ответ, но другие люди могут найти это полезным.

Если вы привязываетесь к bool, не забудьте включить конвертер bool to visibility.

..., Converter={StaticResource BoolToVis}}"
...