3 / 3 / 0
Регистрация: 12.09.2016
Сообщений: 109
WPF

Можно ли забиндить дата-триггер к вьюмодели, которая не является контекстом текущего элемента

02.12.2022, 02:32. Показов 388. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня общие контекты регистрируются как синглтоны в DI. Есть локатор, который из извлекает:
C#
1
2
3
4
5
    internal class ContextLocator
    {
///
        public static SessionContext? SessionContext => App.Host.Services.GetService<SessionContext>();
    }
Локатор добавлен в ресурсы приложения:
XML
1
2
3
4
5
6
7
8
9
<Application x:Class="Gui.BuyerDesktop.App"
///
             StartupUri="./Windows/MainWindow.xaml">
    <Application.Resources>
///
        <ctx:ContextLocator x:Key="Contexts"/>
///
    </Application.Resources>
</Application>
Соответственно, я извлекаю вьюмодели таким способом:
XML
1
<DockPanel DockPanel.Dock="Top" Height="65" Background="#fcec5e" DataContext="{Binding SessionContext, Source={StaticResource Contexts}}">
Но как быть, если контекстом элемента является одна вьюмодель, но в дата-триггере мне нужно сослаться на свойство другой ВМ. Попробовал так, руководствуясь подсказками IDE, но не сработало:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        <StackPanel x:Name="mainMenuBlock" DockPanel.Dock="Top" Orientation="Horizontal" Height="45" Margin="13,7,13,0" DataContext="{Binding SessionContext, Source={StaticResource Contexts}}">
///
            <TextBlock x:Name="mainMenuBlock_TextBlock_Orders"
                       FontFamily="{StaticResource BR}">
                <Hyperlink Style="{StaticResource hyperlink_Orders}"
                           Command="{Binding ChangeTabCmd}"
                           CommandParameter="0">
                    Заказы
                </Hyperlink>
            </TextBlock>
            <StackPanel.Resources>
                <Style TargetType="TextBlock" x:Key="mainMenuBlock_TextBlock_Orders">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=SessionContext.IsAuth, Source={StaticResource Contexts}}" Value="False">
                            <Setter Property="Visibility" Value="Collapsed"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </StackPanel.Resources>
        </StackPanel>
То есть можно ли задать в расширенной разметке 1) свойство 2) объект вм 3) источник этой вм?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.12.2022, 02:32
Ответы с готовыми решениями:

Программа, которая по числу (целого числа от 1 до 31) печатает на экране, является ли этот день мая текущего года
Написать программу, которая по числу (целого числа от 1 до 31) печатает на экране, является ли этот день мая текущего года праздником (и...

Предоставленный DependencyObject не является контекстом для данного объекта Freezable.
В окно динамически добавляю картинку: Thread frl = new Thread(method); frl.Start(); frl.IsBackground =...

Забиндить команду к ListView на выбор элемента
Хочу в соотвестии с патерном MVVM убрать обработку выбора элемента в свой ViewModel. Как должна выглядить такая команда, и как добавить ее...

3
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11239 / 2887
Регистрация: 21.04.2018
Сообщений: 33,040
Записей в блоге: 2
02.12.2022, 10:48
Цитата Сообщение от romaro Посмотреть сообщение
но в дата-триггере мне нужно сослаться на свойство другой ВМ.
Не понял.

Вы пишите: У меня общие контекты регистрируются как синглтоны в DI. Есть локатор, который из извлекает.
Что вы здесь имеете ввиду под контекстами?
По идее это должны быть все используемые вами VM.

И ваш локатор должен выглядеть так:
C#
1
2
3
4
5
6
7
    public class ContextLocator // Классы которые используете в WPF XAML лучше всегда объявляйте публичными
    {
        // Свойства ЭКЗЕМПЛЯРА, а не статические
        public /* static */ SessionContext? SessionContext => App.Host.Services.GetService<SessionContext>();
        public MainVM? MainVM => App.Host.Services.GetService<MainVM>();
        public ChildVM? ChildVM => App.Host.Services.GetService<ChildVM>();
    }
Соответственно нет никакой проблемы при обращении к любой VM.
Возможно ошибка была вызвана тем что вы использовали статические свойства.

P.S. Если вы создаёте DI синглтоны, то почему бы тогда сами VM классы не реализовать как синглтоны?
0
3 / 3 / 0
Регистрация: 12.09.2016
Сообщений: 109
02.12.2022, 11:08  [ТС]
Элд Хасп, то есть вот такой синтаксис должен работать? С доступом к свойству через точку:
XML
1
<DataTrigger Binding="{Binding Path=SessionContext.IsAuth, Source={StaticResource Contexts}}" Value="False">
При условии, что родительскому элементу был назначен другой контекст.

Добавлено через 2 минуты
Да, контекст = вьюмодель у меня. Просто за время работы в вебе приелось.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11239 / 2887
Регистрация: 21.04.2018
Сообщений: 33,040
Записей в блоге: 2
02.12.2022, 11:21
Цитата Сообщение от romaro Посмотреть сообщение
"{Binding Path=
Path излишен в данном случае.
Цитата Сообщение от romaro Посмотреть сообщение
При условии, что родительскому элементу был назначен другой контекст.
При условии, если SessionContext это свойство экземпляра.
Если это статическое свойство, то так:
XML
1
<DataTrigger Binding="{Binding IsAuth, Source={x:Static ContextLocator.SessionContext}}" Value="False">
Какой текущий DataContext не имеет значения, если привязке источник задаётся явно: Source, RelativeSource или ElementName.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.12.2022, 11:21
Помогаю со студенческими работами здесь

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

Можно ли забиндить клиентский сокет?
Пытаюсь сделать сокет-клиент, в задании сказано, что необходимо реализовывать отправку всегда с определенного порта (к примеру 50000-го)....

Можно ли в один combobox забиндить 2 атрибута из таблицы БД
Товарищи, возник вопрос! Возможно ли забиндить на комбобокс 2 значения из таблицы. Пример: таблица user IDuser firstName ...

Дата триггер (по условию сравнения) возможен?
Здравствуйте все, Простенький пример для наглядности. &lt;Page.Resources&gt; &lt;Style TargetType=&quot;DataGridRow&quot;&gt; ...

Триггер - дата доставки не превышала Конец_срока_годности Продукта!
Помогите с триггером пожалуйста! Мне нужно, что бы дата доставки не превышала Конец_срока_годности!!! Если дата доставки превысила дату...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru