Доступ к DataContext страницы из MainWindow (с помощью Telerik) - PullRequest
0 голосов
/ 31 августа 2018

Я относительно новичок в WPF и наткнулся на проблему, для которой просто не могу найти решение.

Я уверен, что уже существует тема, касающаяся такой проблемы, но в отношении моих недостатков, весьма вероятно, что я не нашел ее или просто не понял ее.

Моя проблема:

Я занимаюсь разработкой WPF-приложения на C #. Это приложение в стиле Outlook с большим MainWindow с огромной ViewModel и XAML. То, что я пытался сделать, это немного разделить отдельные кодовые файлы, чтобы сделать его немного более модульным и компактным. Я использую Telerik Controls и пытался перенести контент отдельных SplitContainers в Pages, который до сих пор работал нормально.

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

Положение:

У меня есть «Древовидная структура» в моем «Основном окне», и всякий раз, когда я изменяю выделение, я хочу изменить свойство на моей странице, к которому я сделал привязку.

Итак, когда я нажимаю на элемент в «TreeView_3», я хочу установить свойство через EventHandler (SelectionChanged_TreeView3) для DataContext «Page_X».

Если бы мне пришлось сделать это в MainWindow, я бы обычно делал это так:

UserViewModel uvm = mainGrid.DataContext as UserViewModel;

Затем просто вызовите любое свойство определенного UserViewModel (ViewModel в MainWindow), к которому я хочу получить доступ.

Я не могу сделать то же самое для страницы, очевидно, поскольку «mainGrid.DataContext» всегда будет ссылаться на MainWindow, так как именно здесь вызывается обработчик событий.

Так что мне нужно было бы небольшое объяснение того, как получить доступ к DataContext со страницы с другой моделью представления.

Если вам нужен какой-либо код для объяснения, дайте мне знать.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Вы должны отделить свои проблемы. В вашем коде позади должен быть только код, который обрабатывает view связанные вещи. Чаще всего мой код пуст.

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

Поскольку нет возможности привязать команду к SelectedItemChanged вашего TreeView, вы можете использовать триггер взаимодействия.

<TreeView xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectedItemChanged">
            <i:InvokeCommandAction Command="{Binding Path=SomeCommand, Mode=OneWay}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</TreeView>
0 голосов
/ 31 августа 2018

Рувен, трудно сказать без какого-либо примера кода. Но может быть, что вам нужно реализовать INotifyPropertyChanged на ViewModels?

https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-implement-property-change-notification

путем вызова OnPropertyChanged ("PropertyName"); в установщике свойства viewmodel пользовательский интерфейс примет изменение.

Также убедитесь, что оба вида ссылаются на один и тот же объект, а не на копии одного и того же объекта.

...