Связывание строкового свойства datacontext с ключом StaticResource - PullRequest
8 голосов
/ 30 марта 2009

У меня есть значения List с ResourceKey и Caption, оба значения являются строками. Ресурс - это имя фактического ресурса, определенного в словаре ресурсов. Каждая из этих иконок ResourceKey - это Canvas.

<Data ResourceKey="IconCalendar" Caption="Calendar"/>
<Data ResourceKey="IconEmail" Caption="Email"/>

Затем у меня есть представление списка, в котором есть табличка с кнопкой и текстовая подпись под кнопкой. Что я хочу сделать, это отобразить статический ресурс Resource в качестве содержимого для кнопки.

<ListView.ItemTemplate>
    <DataTemplate>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>

            <Button Content="{Binding ResourceKey}" Template="{StaticResource  RoundButtonControlTemplate}"/>
            <TextBlock Grid.Row="1" Margin="0,10,0,0" Text="{Binding Caption}" HorizontalAlignment="Center" FontSize="20" FontWeight="Bold" />
        </Grid>
    </DataTemplate>
</ListView.ItemTemplate>

Я думаю, что перепробовал каждую перестановку с привязкой staticresource и т. Д.

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

Спасибо

Ответы [ 2 ]

11 голосов
/ 30 марта 2009

Подумав немного, я использовал ValueConvertor примерно так:

class StaticResourceConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var resourceKey = (string)value;

        return Application.Current.Resources[resourceKey];
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new Exception("The method or operation is not implemented.");
    }
}

и привязка к кнопке становится

<Button Content="{Binding ResourceKey, Converter={StaticResource resourceConverter}}" />
2 голосов
/ 15 апреля 2016

Здесь у меня есть улучшенная версия ответа @dvkwong (вместе с правкой @Anatoliy Nikolaev):

class StaticResourceConverter : MarkupExtension, IValueConverter
{
    private Control _target;


    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var resourceKey = (string)value;

        return _target?.FindResource(resourceKey) ?? Application.Current.FindResource(resourceKey);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var rootObjectProvider = serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
        if (rootObjectProvider == null)
            return this;

        _target = rootObjectProvider.RootObject as Control;
        return this;
    }
}

использование:

<Button Content="{Binding ResourceKey, Converter={design:StaticResourceConverter}}" />

Основное изменение здесь:

  1. Конвертер теперь System.Windows.Markup.MarkupExtension, поэтому его можно использовать напрямую, без объявления в качестве ресурса.

  2. Конвертер является контекстно-зависимым, поэтому он будет искать не только ресурсы вашего приложения, но и локальные ресурсы (текущее окно, контроль пользователя или страницы и т.

...