#c# #wpf #frame #datacontext
#c# #wpf #фрейм #datacontext
Вопрос:
В wpf можно ли получить доступ к DataContext текущей страницы фрейма? Если ДА, то как?
Если НЕТ, что я должен использовать в качестве замены для frame, чтобы я мог получить доступ к его DataContext?
Если что-то не понятно, пожалуйста, скажите мне.
Обновление: для пояснения
У меня есть Frame
вход MainWindow.xaml
. Я хочу получить доступ DataContext
к текущей странице, отображаемой в Frame
. Давайте просто скажем, что я хочу отобразить string
свойство с именем title ViewModel
текущей страницы. (Предположим, что каждая страница ‘ ViewModel
имеет свойство title)
Обновление: вот мой MainWindow.xaml
<Window x:Class="Libertalia.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
.
.
.
DataContext="{Binding Main, Source={StaticResource Locator}}"
>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<Grid>
<Frame Panel.ZIndex="1" x:Name="MainFrame" JournalOwnership="OwnsJournal" NavigationUIVisibility="Hidden" Source="View/BlankPage.xaml" />
</Grid>
</ScrollViewer>
</Window>
Код страницы (только один из них, просто образец):
<Page x:Class="Libertalia.View.LoginView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:behaviors="clr-namespace:Libertalia.Behavior"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
.
.
.
DataContext="{Binding Page1, Source={StaticResource Locator}}"
<DockPanel Margin="200" >
</DockPanel>
</Page>
ОБНОВЛЕНИЕ: модель, представление и связь ViewModel
-
MainWindow.xaml
(View) привязан кMainViewModel.cs
(ViewModel). Короче говоря,MainWindow.xaml's
DataContext
этоMainViewModel.cs
-
MainWindow.xaml
(Просмотр) имеетFrame
Frame
имеетPage
(Просмотр).Frame
имеет много страниц, отображаемых по одной за раз.Page
имеет свой собственный ViewModel (DataContext
)
Что я хочу сделать:
- Доступ к текущей странице’ (фрейма)
DataContext
изDataContext
MainWindow (MainViewModel).
Комментарии:
1. Вы имеете в виду доступ к DataContext представления из кода представления?
2. Нет, я хочу получить доступ к
DataContext
странице изMainWindow.xaml
(родительского элементаFrame
).3. Что вы подразумеваете под «страницей»?
4. Если я понимаю вашу идею, да — в целом это возможно, но вам нужно предоставить более подробную информацию о ваших моделях просмотра и представлениях. Добавьте код и объяснение.
5. Я улучшаю реальный код, потому что мне нужно увидеть взаимосвязь между вашими представлениями и моделями представлений. Что такое фрейм? Вы имеете в виду представление, которое является содержимым вашего окна?
Ответ №1:
Я не уверен, что это сработает для вас, потому что я все еще не понимаю взаимосвязи между моделями представления и моделями в вашей архитектуре, но попробуйте использовать эту идею:
1). xaml моего Window1 имеет следующее содержимое :
<Grid>
<Frame Panel.ZIndex="1"
x:Name="MainFrame"
JournalOwnership="OwnsJournal"
NavigationUIVisibility="Hidden"
Source="UserControl1.xaml" />
</Grid>
2) UserControl1 имеет определение DataContext:
public UserControl1()
{
InitializeComponent();
DataContext = new MainViewModel();
}
3). Код, в котором я извлекаю и изменяю DataContext содержимого моего фрейма:
Window1 window = new Window1();
//window.Content = uc;
var aa = window.Content as Grid;
foreach (var e in aa.Children)
{
if (e is Frame)
{
Frame f = e as Frame;
f.ContentRendered = F_ContentRendered;
}
}
//only inside of handler of ContentRendered event you can access to the content of your Frame:
private void F_ContentRendered(object sender, EventArgs e)
{
var frame = sender as Frame;
UserControl1 uc1 = frame.Content as UserControl1;
MainViewModel mvm = uc1.DataContext as MainViewModel;
}
Это должно сработать.
Комментарии:
1. Спасибо за усилия. Я добавил некоторый код к своему вопросу, чтобы вы лучше поняли мой сценарий. Но, как вы можете видеть, я использую MVVMLight так много кода в отдельных файлах, поэтому сложно опубликовать весь мой код.
2. Итак, в вашем случае в BlankPage.xaml есть целевой DataContext с моделью представления, которую вы хотите изменить. Правильно?
3. Я попробовал основную идею, которую я опубликовал в своем решении, и она все еще работает! Я могу получить доступ к DataContext и изменить его свойства. Я немного изменю свой пост.
4. Извините, но у меня это не работает. Куда вы поместили свой третий код? Я поместил его в MainViewModel, я прав?
5. Я понял это из-за вашего примера. Спасибо.