C# Без Обратной Функции 84 символа
int p(char[]s){int i=0,l=s.Length,t=1;while(++i<l)if(s[i]!=s[l-i-1])t&=0;return t;}
C# Без Обратной Функции 86 символов
int p(char[]s){int i=0;int l=s.Length;while(++i<l)if(s[i]!=s[l-i-1])return 0;return 1;}
VBScript 41 символ
function p:p=s=strreverse(s):end function
В настраиваемых MarkupExtensions есть ошибка, которая не позволяет вам использовать их в таком атрибуте.
Обходной путь 1: Объявите атрибут как элемент, например:
<Image>
<Image.Source>
<local:BindableStaticResource Binding={Binding Icon}" />
</Image.Source>
</Image>
Обходной путь 2: Если вы предварительно скомпилируете MarkupExtension, поместив его в другую сборку и сделав ссылку на него, он снова заработает. Возможно, поэтому вы видите, что он работает в главном окне, а не в шаблоне данных.
Первое обходное решение, о котором вы упомянули, можно найти здесь: Привязка строкового свойства datacontext к ключу StaticResource
Я попытался использовать второе решение, о котором вы упомянули ( http://sweux.com/blogs/psampaio/index.php/2009/06/16/using-data-binding-with-static-resources-in-wpf/), но оно так и не заработало. Возникла ошибка ArgumentNullException, поскольку DataContext был нулевым. Я думаю, это было связано с тем, что я использовал DataTemplate для создания представления из ViewModel, и каким-то образом DataContext не был установлен до вызова метода ProvideValue (в примере на этой странице DataContext устанавливается в классе .xaml.vb).
Поэтому я начал искать обходной путь и нашел один, который также включает в себя конвертер, но в этом случае ресурс находится через метод FrameworkElement вместо того, чтобы копаться в Application.Current. То, что я нашел, подробно описано здесь:
http://drwpf.com/blog/2007/08/18/can-my-value-converter-access-the-target-of-the-binding/
Я скопирую соответствующую информацию сюда:
Он включает в себя ValueConverter, реализующий интерфейс IMultiValueConverter, чтобы иметь доступ к контролу, на котором установлена привязка.
Код для метода Convert выглядит следующим образом:
public object Convert(object[] values, Type targetType,
object parameter, CultureInfo culture)
{
FrameworkElement targetObject = values[0] as FrameworkElement;
if (targetObject == null)
{
return DependencyProperty.UnsetValue;
}
return targetObject.TryFindResource(values[1]);
}
А XAML для элемента управления содержимым будет выглядеть следующим образом:
<ContentControl>
<ContentControl.Content>
<MultiBinding Converter="{StaticResource Converter}">
<MultiBinding.Bindings>
<Binding RelativeSource="{RelativeSource Self}" />
<Binding Path="ResourceKey" />
</MultiBinding.Bindings>
</MultiBinding>
</ContentControl.Content>
</ContentControl>
А XAML для изображения выглядит следующим образом:
<Image Height="16" Width="16">
<Image.Source>
<MultiBinding Converter="{StaticResource Converter}">
<MultiBinding.Bindings>
<Binding RelativeSource="{RelativeSource Self}" />
<Binding Path="ResourceKey" />
</MultiBinding.Bindings>
</MultiBinding>
</Image.Source>
</Image>
Работает как шарм :D