0

На главном окне есть DataContext со статичным ресурсом ViewModelLocator и фрейм с Binding

<Window DataContext="{Binding MainViewModel, Source={StaticResource ViewModelLocator}}" x:Class="SystemBackdropTypes.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:local="clr-namespace:SystemBackdropTypes"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:viewmodels="clr-namespace:SystemBackdropTypes.ViewModels"
        Background="Transparent"
        Title="DWM System Backdrop Type Sample" Height="450" Width="800" Loaded="Window_Loaded"
        mc:Ignorable="d">
&lt;Grid&gt;
    &lt;Frame x:Name=&quot;_this&quot; Content=&quot;{Binding PageSource}&quot; NavigationUIVisibility=&quot;Hidden&quot; /&gt;

Как это всё написать на C#? Мне нужно получить PageSource из MainViewModel и загрузить в фрейм

MainViewModel:

using DevExpress.Mvvm;
using System.Windows.Controls;
using SystemBackdropTypes;
using SystemBackdropTypes.Pages;
using SystemBackdropTypes.Services;

namespace SystemBackdropTypes.ViewModels { public class MainViewModel : BindableBase { private readonly PageService _pageService;

    public Page PageSource { get; set; }

    public MainViewModel(PageService pageService)
    {
        _pageService = pageService;


        _pageService.OnPageChanged += (page) =&gt; PageSource = page;
        _pageService.ChangePage(new LoginPage());
    }
}

}

Я пытался сделать что-то типа:

_this.Content = DataContext.PageSource;

и

Binding binding = BindingOperations.GetBinding(_this, Frame.ContentProperty);
_this.Content = binding.Source;

Я новичок в WPF, так что строго не судите)

Mr. Dandomi
  • 117
  • 1
  • 10
  • 1
    Если вы новичок, то я очень сильно советую вам отказаться от всех фреймворков, которые вы думаете, что "облегчат вам жизнь". Ведь вы даже не знаете как это все работает, но уже говорите о "локаторе"... Так что, удаляйте DevExpress.Mvvm, он вам сейчас лишь навредит. Далее, DataContext со статичным ресурсом - это плохо, ведь окно не должно быть ответсвенным за создание данных, также не должно быть зависимо от данных. Далее, Loaded="Window_Loaded" - не лучшая идея в MVVM подходе, ибо при этом подходе все события меняются на комманды. – EvgeniyZ Dec 22 '21 at 20:42
  • Ну и последнее - Page, этот контрол не предназначен для тех целей, которые вы хотите. Почему? Писал тут. Так что, сейчас вы делаете не совсем то, что нужно. Хотите разного содержимого окна - вам сюда. Ну и старайтесь максимально отвязать UI (View) от данных (Model/ViewModel). – EvgeniyZ Dec 22 '21 at 20:45
  • @EvgeniyZ Спасибо. Есть какой ни будь пример реализации на github'e? И как сохранять состояние страницы и как в неё передавать переменные? – Mr. Dandomi Dec 22 '21 at 20:53
  • 1
    Пример чего вам надо? Страниц? Тут на SO таких ответов полно. И да, в WPF нету "форм", тут "окна", совсем другая штука. И прочитайте еще раз мой комментарий выше - вы должны максимально отделить данные от UI. Работайте с классами, вот как бы вы сделали все это в простом консольном проекте? Вот тут тоже самое, только Console.WriteLine() заменяете на свойства, к которым в дальнейшем привязываете UI. Поэтому, сохранение данных и передача - это вопросы из разряда "как мне сохранить состояние класса и как мне передать в него данные", а на них я думаю вы знаете ответ, не так ли? – EvgeniyZ Dec 22 '21 at 20:57
  • Многостраничный пример https://ru.stackoverflow.com/a/1266479/373567, подписываюсь под всем что выше. :) – aepot Dec 22 '21 at 23:23
  • @EvgeniyZ а всё же. Можете ответить на мой вопрос? – Mr. Dandomi Dec 23 '21 at 15:33
  • А я вам не ответил на вопрос? Вроде все разжевал, дал ссылки полезные, сказал куда двигаться. Вам вон даже полноценный пример кинули многостраничного интерфейса, чего вы еще то хотите? – EvgeniyZ Dec 23 '21 at 15:41
  • @EvgeniyZ у меня в свойстве фрейма Content есть "{Binding PageSource}" которое зависит от DataContext. Как то же самое написать в коде C#? Просто интересно, гугл не особо помог – Mr. Dandomi Dec 23 '21 at 16:43
  • Я не понимаю ваш вопрос. Я вам выше написал, что вы максимально должны в WPF проекте отделить UI от данных, сказал как должно быть, даже код во вам дали. А вы сейчас берете и спрашиваете "а как мне в коде указать Content". Ну берите, задавайте имя фрейму (x:Name) и обращайтесь через него в C# коде (myName.Content = PageSource). Но делаете вы ерунду. – EvgeniyZ Dec 23 '21 at 17:47

0 Answers0