Как заставить преобразователь выполнить при изменении свойства? - PullRequest
1 голос
/ 05 марта 2011

Это мое изображение в XAML:

<Image Margin="0"
       Stretch="UniformToFill"
       Source="{Binding '', Converter={StaticResource byteArrToBitmap}}">
   <ToolTipService.ToolTip>
        <Border  BorderBrush="#FF3D3D3D"  Background="#FFFFE1E1">
            <TextBlock Text="{Binding PhotoDescription, TargetNullValue=No description}"
                       Width="170"
                       Height="Auto"
                       FontFamily="Georgia"
                       TextWrapping="Wrap"
                       Foreground="#FF373737"/>
        </Border>
   </ToolTipService.ToolTip>                        
</Image>

Это изображение находится внутри DataTemplate списка. Как вы видите, у меня установлен источник {Binding ''}, что означает, что он связан с текстовым текстом, а не с фактическим свойством, которое я хочу связать. Это важно, потому что у меня есть логика, на основе которой я возвращаю изображение.

Я загружаю изображения на лету с веб-сервисов, и он возвращает byte[]. У меня INotifyPropertyChanged реализовано в классе. Однако, поскольку у меня есть настройка привязки к DataContext, преобразователь не выполняет себя заново, когда byte[] загружается асинхронно.

Ответы [ 4 ]

1 голос
/ 05 марта 2011

Это очень плохая идея, чтобы связать что-то с самим DataContext ... прямо сейчас Silverligth 4 не реализует INotifyPropertyChanged для DataContext, поэтому у вас есть две опции:

1) ждать Silverligt 5:

Silverlight 5 – Список функций

Представляется событие DataContextChanged.Расширения разметки позволяют запускать код во время синтаксического анализа XAML как для свойств, так и для обработчиков событий, обеспечивая передовую поддержку MVVM.

2) создать некоторый объект, который реализует INotifyPropertyChanged, создать некоторое свойство и привязать к этому свойству ...

0 голосов
/ 01 июля 2011

Если вы измените привязку, чтобы она была привязана к какому-либо свойству, даже если это не требуется в области действия вашего приложения, вы можете косвенно заставить пересчитать конвертер при изменении этого свойства. Это свойство должно существовать в объекте, который реализует INotifyPropertyChanged.

При необходимости могу дать исходный код.

0 голосов
/ 05 марта 2011

Я предполагаю, что ваш контекст данных - это byte[], который вы хотите преобразовать.Поэтому вы должны убедиться, что событие PropertyChanged вызывается при завершении асинхронной загрузки.Также убедитесь, что событие вызывается в главном потоке, а не в рабочем или фоновом потоке.

0 голосов
/ 05 марта 2011

Я верю, что вы просто хотите

{Binding Converter={StaticResource byteArrToBitmap}}

Не

{Binding '', Converter={StaticResource byteArrToBitmap}}

Поскольку не указывать какой-либо путь свойства, он будет привязан к DataContext. Я понятия не имею, что делает {Binding ''}, но это не стандартная практика. Я удивлен, что на самом деле это не исключение.

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

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