MVVM Привязка к Page.DataContext из TabControl - PullRequest
0 голосов
/ 04 июля 2018

Я структурирую свое приложение WPF с использованием MVVM Light и создаю модель представления с использованием IOC.

Страница инициализирует свой DataContext следующим образом:

DataContext="{Binding Main, Source={StaticResource Locator}}"

Контент TabControl привязан к другой ViewModel, поэтому привязка из TabControl по умолчанию будет обращаться к вкладке ViewModel.

Теперь, как мне получить доступ к странице ViewModel в XAML?

Перед переключением на использование IOC ViewModel был создан как StaticResource, и я мог получить к нему доступ вот так

Zoom="{Binding Zoom, Source={StaticResource ViewModel}, Mode=TwoWay}"

Тогда я мог бы также получить к нему доступ через локатор, однако мне не нравится этот синтаксис, что происходит, если этот экземпляр ViewModel был создан с ключом? Я не думаю, что привязка контента должна заботиться о таких деталях.

Zoom="{Binding Main.Zoom, Source={StaticResource Locator}, Mode=TwoWay}"

Как правильно это сделать?

1 Ответ

0 голосов
/ 04 июля 2018

Вы можете использовать RelativeSource Binding с Mode, установленным в FindAncestor. Это позволит вам привязать к DataContext вашего окна (или любому другому элементу, который содержит ваш элемент управления Tab), ничего не зная об этом.

Я создал простой пример на основе вашего описания. У меня есть 2 простых модели просмотра:

public class MainViewModel : ViewModelBase
{
    public double Zoom { get; } = 1;
}

public class TabViewModel : ViewModelBase
{
    public double Zoom { get; } = 2;
}

А вот содержимое моего xaml:

<Window
...blah blah blah...
DataContext="{Binding Main, Source={StaticResource Locator}}"
>
<Grid>
    <TabControl>
        <TabItem DataContext="{Binding Tab, Source={StaticResource Locator}}" Header="TabItem">
            <StackPanel>
                <Label Content="{Binding DataContext.Zoom, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" />
                <Label Content="{Binding Zoom}" />
            </StackPanel>
        </TabItem>
    </TabControl>
</Grid>

Первая метка получает свое значение из MainViewModel, а вторая - из TabViewModel.

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

Надеюсь, это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...