Резервные вызовы конвертера при использовании триггеров для определения значения - PullRequest
2 голосов
/ 11 апреля 2011

Я заметил, что моя разметка XAML тратит впустую ресурсы, делая преобразования, которые это не должно делать. например у меня есть следующий стиль, который действует как переключатель:

<Style TargetType="{x:Type Image}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsDownloaded}" Value="True">
            <Setter Property="Source"
                    Value="{Binding Data, Converter={StaticResource ByteArrayToBitmapImageConv}}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding IsDownloaded}" Value="False">
            <Setter Property="Source"
                    Value="{Binding Url, Converter={StaticResource UrlToBitmapImageConv}}"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

Очевидно, это должно либо загрузить изображение, если оно не было кэшировано, либо превратить необработанные данные в BitmapImage. Проблема состоит в том, что, как только оба случая имели место, по крайней мере, один раз оба преобразователя вызываются при изменении DataContext, независимо от значения, которое имеет IsDownloaded. Таким образом, он либо отобразит преобразованное изображение, но все равно загрузит его независимо в фоновом режиме, либо загрузит изображение и попытается преобразовать null (данные) в BitmapImage.

Установка режима привязки на OneTime сделал не помогло, к сожалению.

Я ищу чистый способ избежать этого, так как это даже происходит несколько раз в моем приложении. например здесь:

<Style TargetType="ContentControl">
    <Setter Property="Content" Value="{StaticResource ContentNothingSelected}"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding Source={x:Static local:App.Settings}, Path=DisplayMode_Current}"
                     Value="Description">
            <Setter Property="Content" Value="{StaticResource DescriptionViewer}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Source={x:Static local:App.Settings}, Path=DisplayMode_Current}"
                     Value="WebPage">
            <Setter Property="Content" Value="{StaticResource WebPageViewer}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Source={x:Static local:App.Settings}, Path=DisplayMode_Current}"
                     Value="Media">
            <Setter Property="Content" Value="{StaticResource MediaViewer}"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

Даже если режим отображения установлен на Media или Description, приложение будет переходить на соответствующий сайт в фоновом режиме, тратить ресурсы и выбрасывать случайные неуместные уведомления об ошибках Javascript.

Ранее я делал большую часть этого в коде, но я изменил его, чтобы он был более декларативным, и я хотел бы сохранить его таким, любая помощь будет оценена.

1 Ответ

0 голосов
/ 21 июня 2011

Вы можете пересмотреть использование триггеров и вместо этого использовать пользовательский элемент управления и диспетчер визуальных состояний. Поместите логику загрузки, кэширования и преобразования изображений в пользовательский элемент управления и просто установите соответствующие состояния. Трудно привести пример без дополнительной xaml. Я в дружеских отношениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...