WPF: можно ли привязать родителя к свойству userControl и установить его DataContext для модели представления? - PullRequest
0 голосов
/ 31 октября 2018

Я застрял на этом некоторое время, прежде чем я даже узнал, почему все не работает. Я изменяю видимость двух разных элементов управления UserControl, основываясь на значении Connected, которое является свойством в SetupViewModel (parent). У одного из этих пользовательских элементов управления также есть свой DataContext, установленный к модели представления, которая создается в SetupViewModel. Но привязка для подключения не работает, когда также устанавливается DataContext.


Вот как я бы хотел, чтобы это работало

<userControls:SessionSetupUserControl x:Name="SessionSetupUserControl" DataContext="{Binding SessionSetupViewModel}" Visibility="{Binding Connected, Mode=OneWay, Converter={StaticResource BoolToVis}, FallbackValue=Collapsed}" />

Но при использовании этого значения видимости не будет обновляться.


Когда я удаляю DataContext, видимость начинает обновляться.

<userControls:SessionSetupUserControl x:Name="SessionSetupUserControl" Visibility="{Binding Connected, Mode=OneWay, Converter={StaticResource BoolToVis}, FallbackValue=Collapsed}" />

Это родительская ViewModel. Отображаются только соответствующие привязки.

public class SetupViewModel : BindableBase
{
    private bool _connected;

    public SessionSetupViewModel SessionSetupViewModel { get; private set; }

    public bool Connected
    {
        get
        {
            return _connected;
        }
        private set
        {
            SetPropertyAndNotifyChanges(ref _connected, value);
        }
    }
}

Я предполагаю, что DataContext из UserControl изменяется, когда разрешается привязка видимости, но я не привык работать ни с WPF, ни с привязками, поэтому я не смог заставить его работать.

Любая помощь будет наиболее ценной.

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Другим вариантом привязок будет размещение элемента управления ...

<UserControl Visibility="{Binding Connected, Mode=OneWay, Converter={StaticResource BoolToVis}, FallbackValue=Collapsed}" >

    <userControls:SessionSetupUserControl x:Name="SessionSetupUserControl" 
        DataContext="{Binding SessionSetupViewModel}" />

</UserControl>

Таким образом, внешний универсальный «UserControl» имеет свои привязки непосредственно к себе и может быть видимым / скрытым / свернутым на основе вашего конвертера.

Тогда внутренний пользовательский элемент управления специально привязан к контексту данных SessionSetupViewModel

0 голосов
/ 12 июня 2019

Поскольку вы изменили DataContext для своего экземпляра SessionSetupUserControl, другие привязки пытаются разрешить назначенный вами DataContext.

Это означает, что ваша привязка для Visibility ищет свойство с именем «Подключено» в SessionSetupViewModel.

Обратите внимание на выходной журнал Visual Studio при отладке, вы должны увидеть ошибки привязки, которые в значительной степени говорят об этом.

0 голосов
/ 31 октября 2018

Вы всегда можете связать свойство в DataContext родительского элемента элемента управления следующим образом:

Visibility="{Binding Parent.DataContext.Connected,
                     RelativeSource={RelativeSource Self},
                     Converter={StaticResource BoolToVis}}"

Однако вы можете рассмотреть другой дизайн, когда ваш UserControl не привязывается напрямую к явно назначенному DataContext.

Элемент управления может предоставлять свойства зависимостей, которые связаны при его создании. Таким образом, он станет независимым от какой-либо конкретной модели представления.

<userControls:SessionSetupUserControl
    Visibility="{Binding Connected, Converter={StaticResource BoolToVis}}"
    SomeProperty="{Binding SessionSetupViewModel.SomeVmProperty}"
    SomeOtherProperty="{Binding SessionSetupViewModel.SomeOtherVmProperty}"
    .../>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...