Nano Hash - криптовалюты, майнинг, программирование

Как привязать имя StaticResource к свойству ViewModel?

У меня есть сценарий, в котором моя этикетка Xamarin отображает значок из файла ttf. В существующем виде этикетка выглядит следующим образом.

<Label
Text="{StaticResource Account}"/>

Где Account - это строка в моем файле Styles.xaml, которая определяет значение Hex.

<x:String x:Key="Account">&#xe70e;</x:String>

Вышеупомянутое работает нормально. Однако я хотел бы связать текстовое имя значка через свойство в моей модели просмотра. Следующее не работает, но я думаю о чем-то вроде этого:

 Text="{StaticResource Binding=IconName}"

Как бы я этого добился?

ОБНОВЛЕНИЕ: добавление контекста к этому вопросу.

В моем Styles.xaml я определяю словарь, соответствующий их шестнадцатеричным значениям.

<x:String x:Key="Back">&#xe709;</x:String>
<x:String x:Key="Share">&#xe704;</x:String>
<x:String x:Key="Next">&#xe71a;</x:String>
<x:String x:Key="Account">&#xe70e;</x:String>
<x:String x:Key="Bell">&#xe700;</x:String>
<x:String x:Key="Mail">&#xe70e;</x:String>
<x:String x:Key="Help">&#xe72c;</x:String>

Этот файл стилей является ресурсом для моего файла xaml.

        <ContentPage.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="Styles.xaml" />
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </ContentPage.Resources>

В моем файле XAML я повторяю, чтобы отобразить разные значки.

            <StackLayout
                x:Name="ItemsList"
                Grid.Row="1"
                BindableLayout.ItemsSource="{Binding MenuItems}">
                <BindableLayout.ItemTemplate>
                    <DataTemplate>
                        <StackLayout>
                            <Label  Text="{StaticResource Account}" FontFamily="{StaticResource FontIcons}"
                                FontSize="Large"></Label>
                        </StackLayout>
                    </DataTemplate>
                </BindableLayout.ItemTemplate>
            </StackLayout>

И в моем списке я указываю имя значка.

        MenuItems = new List<AppMenuItem>()
        {
            new AppMenuItem()
            {
                Title = "View A",
                IconSource = "Account",
            },
            new AppMenuItem()
            {
                Title = "View B",
                IconSource = "Mail",
            }

        };

ОБНОВЛЕНИЕ 2: я пытаюсь создать преобразователь значений, но не могу получить доступ к объединенным словарям. Я использую:

Application.Current.Resources.TryGetValue (value.ToString (), out var retValue);

retValue всегда возвращает NULL.


  • если это свойство виртуальной машины, просто используйте "{Binding IconName}" 30.11.2019
  • Это не совсем работает, потому что это просто привязка к строковому свойству IconName. Фактический ресурс - это статический ресурс. 30.11.2019
  • Затем попросите геттер вашего свойства вернуть значение ресурса 30.11.2019
  • Я обновил исходный вопрос, добавив еще контекст 30.11.2019
  • Используйте ValueConverter 30.11.2019
  • Я подумал об этом, но я все еще не уверен, как привязать его к StaticResource, я думаю, вот где я застрял 30.11.2019
  • App.Current.Resources [ключ] 30.11.2019
  • попробовал это, в методе convert App.current.resources извлекает ресурсы только из приложения xaml, поскольку я указываю свои ключи в файле styles.xaml, конвертер не видит там ресурсов. 30.11.2019

Ответы:


1

вы можете привязать к стилю ярлыка.

<Style TargetType="Label">
    <Setter Property="Text" Value="{Binding Account}"/>
</Style>
30.11.2019
  • Я не привязываюсь к стилю, я пытаюсь обновить привязку текста 30.11.2019
  • тогда вы можете сделать это напрямую, не используя строку 30.11.2019

  • 2

    Определите класс для глифов значков:

    namespace MyNamespace
    {
        public static class Icons
        {
            public const string Glyph = "\ue000";
            ...
        }
    }
    

    Словарь ресурсов /Resources/Glyphs.xaml:

    <ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms"
                        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                        xmlns:i="clr-namespace:MyNamespace">
    
        <OnPlatform x:Key="Glyph" x:TypeArguments="x:String" Default="{x:Static i:Icons.Glyph}" />
    
    </ResourceDictionary>
    

    Справочный словарь ресурсов со страницы:

    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/Resources/Glyphs.xaml" />
      </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
    

    Пример ViewModel:

    using MyNamespace;
    ...
    public class FontViewModel
    {
        public string GlyphFromClass { get; set; }
    
        public string GlyphFromMergedResource { get; set; }
    
        //pass page in constructor for referencing the page local resource dictionary
        public FontViewModel(Page page)
        {
            GlyphFromClass = Icons.Glyph;
    
            //ResourceDictionary applicationResourceDictionary = Application.Current.Resources;
    
            ResourceDictionary localResourceDictionary = page.Resources;
    
            string str = string.Empty;
            if (localResourceDictionary.TryGetValue("Glyph", out object obj) && obj is OnPlatform<string>)
            {
                str = (OnPlatform<string>)obj;
            }
    
            GlyphFromMergedResource = str;
        }
    }
    

    При необходимости реализуйте INotifyPropertyChanged для класса модели представления и используйте OnPropertyChanged в свойствах.

    Пример использования Viewmodel в коде xaml страницы:

    InitializeComponent();
    
    BindingContext = new FontViewModel(this);
    

    Xaml с привязкой:

    <Label Text="{Binding GlyphFromClass}" FontFamily="{StaticResource FontFamily}" />
    <Label Text="{Binding GlyphFromMergedResource}" FontFamily="{StaticResource FontFamily}" />
    

    Xaml со статическими ресурсами:

    <Label Text="{x:Static i:Icons.Glyph}" FontFamily="{StaticResource FontFamily}" />
    <Label Text="{StaticResource Glyph}" FontFamily="{StaticResource FontFamily}" />
    
    12.12.2019

    3

    Вы можете использовать триггер данных,

    <Label Text="">
         <Label.Triggers>
            <DataTrigger TargetType="Label"
                      Binding="{Binding IconName}"
                      Value="Account">
                      <Setter Property="Text" Value="{StaticResource Account}"/>
             </DataTrigger>
         </Label.Triggers>
    </Label>
    

    Вы можете написать несколько DataTrigger для каждого условия, которое вы хотите сопоставить, и установить StaticResource.

    04.06.2021

    4
  • Это почти привело меня к этому, проблема в том, что я просматриваю список, чтобы отобразить значок в xaml. Я добавил больше контекста к исходному вопросу. 30.11.2019
  • Если бы вы поместили ключи в ContePage.ResourceDictionary, как вы могли бы получить к ним доступ из кода? 30.11.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..