powered by simpleCommunicator - 2.0.34     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / DynamicResource fallback value
1 сообщений из 1, страница 1 из 1
DynamicResource fallback value
    #40014109
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сабж. Если не был найден StaticResource, то мы получаем ошибку, а вот если не был найден DynamicResource, то возможны варианты. Обычно для ссылочных типов конечному потребителю в итоге просто приходит null-значение, которое далее может трактоваться различными способами. В интернетах в основном советуют написать свою реализацию DynamicResourceExtension, либо унаследоваться от него, и добавить свою логику. Как говорится, советовать - не мешки ворочать, даже второй вариант очень трудно реализуем, поскольку ProvideValue у DynamicResource возвращает не непосредственно требуемое значение, а экземпляр ResourceReferenceExpression - это internal-класс, и внутри него тоже всё преимущественно internal.
Логично было бы забиндиться на DynamicResource, и к биндингу прикрутить конвертер, но DynamicResource можно забиндить только на DependencyProperty, а свойство Source у Binding таковым не является.
В результате я сделал так:
Код: xml
1.
2.
3.
4.
5.
6.
<Window.Resources>
  <utils:DataContextSpy
    DataContext="{DynamicResource SomeResourceName}"
    x:Key="BorderBackgroundContext"/>
  <converters:NullBrushConverter x:Key="NullBrushConverter" />
</Window.Resources>


(DataContextSpy взят у Джоша Смита отсюда )
Код: xml
1.
2.
3.
4.
5.
6.
<Border
  Background="{Binding
    Source={StaticResource BorderBackgroundContext},
    Path=DataContext,
    Converter={StaticResource NullBrushConverter},
    ConverterParameter={StaticResource {x:Static SystemColors.HighlightBrushKey}}}" />


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public class NullBrushConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    => value is Brush b ? b : (Brush) parameter;

  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    => throw new NotImplementedException();
}


(опытным путём выяснено, что если DynamicResource не нашелся, то в конвертер приходит null).
Это всё вполне работает, но выглядит, по моему скромному, несколько громоздко. Может, у кого-то есть идеи, как это реализовать более компактно?
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / DynamicResource fallback value
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]