Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
3 / 3 / 0
Регистрация: 12.09.2016
Сообщений: 109
WPF

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

02.12.2022, 02:32. Показов 371. Ответов 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
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 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
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru