Как я могу определить ресурсы в модели представления MVVM?

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
12
задан gix 12 July 2009 в 14:31
поделиться

2 ответа

В настраиваемых MarkupExtensions есть ошибка, которая не позволяет вам использовать их в таком атрибуте.

Обходной путь 1: Объявите атрибут как элемент, например:

<Image>
    <Image.Source>
        <local:BindableStaticResource Binding={Binding Icon}" />
    </Image.Source>
</Image>

Обходной путь 2: Если вы предварительно скомпилируете MarkupExtension, поместив его в другую сборку и сделав ссылку на него, он снова заработает. Возможно, поэтому вы видите, что он работает в главном окне, а не в шаблоне данных.

1
ответ дан 2 December 2019 в 23:43
поделиться

Первое обходное решение, о котором вы упомянули, можно найти здесь: Привязка строкового свойства 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

3
ответ дан 2 December 2019 в 23:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: