0

пишу я спокойно себе разметку, никого не трогаю и тут в один прекрасный момент при сборке вылетела ошибка, которую на протяжении нескольких часов я никак не могу решить. В чем суть, как я понял, если я добавляю на страницу Page111 Data Context MainViewModel и оставляю все так как на первом скриншоте, то вылетает ошибка.

А если я убираю DataContext, то все загружается нормально При этом, если я убираю Content = new Page111() и оставляю в XAML Data Context, то тоже все загружается нормально. А самое интересное в том, что у меня все до этого работало прекрасно, пока я не начал писать ItemControl для DockPanel. Уже голову себе всю сломал, подскажите, в чем дело)

internal partial class MainViewModel{
[ObservableProperty] private ObservableCollection<Client> _clients = new();
[ObservableProperty] private ObservableCollection<TabItem> _tabItems = new();
[ObservableProperty] private ObservableCollection<ScreenShotModel> _screenShots = new();





public MainViewModel()
{
    ApplicationContext db = new();

    var users = db.Clients;


    foreach (var client in users)
    {
        Clients.Add(client);
    }

    TabItems.Add(
        new TabItem
        {
            Title = "89156347371",
            Content = new Page111(),
        }
    );

    ScreenShots.Add(new ScreenShotModel
    {
        Title = $"Скриншот",
        ImgSours = "Regular_FileImage",
        Text = "",
    });

}}

internal class TabItem : ObservableRecipient{
    private string _title;
    private Page111 _content;

    public string Title
    {
        get => _title;
        set => SetProperty(ref _title, value);
    }

    public Page111 Content
    {
        get => _content;
        set => SetProperty(ref _content, value);
<Page x:Class="ChipTunningApp.Views.Windows.TabControl"
      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:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:fa="http://schemas.fontawesome.com/icons/"
      xmlns:view="clr-namespace:ChipTunningApp.ViewModels.MainViewModel"
      xmlns:models="clr-namespace:ChipTunningApp.Models"
      mc:Ignorable="d" 
      d:DesignHeight="450" d:DesignWidth="800"
      Title="TabControl1xaml">

    <Page.DataContext>
        <view:MainViewModel></view:MainViewModel>
    </Page.DataContext>

    <Grid>
        <ScrollViewer>
            <StackPanel>
                <DockPanel  Height="85" Dock="Top" Margin="10 10 10 30">
                    <UniformGrid Rows="2" Columns="6">
                        <TextBlock Text="Имя клиента" HorizontalAlignment="Center" Height="20" FontSize="16" FontWeight="Bold"/>
                        <TextBlock Text="Номер клиента" HorizontalAlignment="Center" Height="20" FontSize="16" FontWeight="Bold"/>
                        <TextBlock Text="Номер авто" HorizontalAlignment="Center" Height="20" FontSize="16" FontWeight="Bold"/>
                        <TextBlock Text="Марка авто" HorizontalAlignment="Center" Height="20" FontSize="16" FontWeight="Bold"/>
                        <TextBlock Text="Модель авто" HorizontalAlignment="Center" Height="20" FontSize="16" FontWeight="Bold"/>
                        <TextBlock Text="Проблема" HorizontalAlignment="Center" Height="20" FontSize="16" FontWeight="Bold"/>
                        <TextBox Margin="3" BorderThickness="3" FontSize="15" FontWeight="DemiBold"/>
                        <TextBox Margin="3" BorderThickness="3" FontSize="15" FontWeight="DemiBold"/>
                        <TextBox Margin="3" BorderThickness="3" FontSize="15" FontWeight="DemiBold"/>
                        <TextBox Margin="3" BorderThickness="3" FontSize="15" FontWeight="DemiBold"/>
                        <TextBox Margin="3" BorderThickness="3" FontSize="15" FontWeight="DemiBold"/>
                        <CheckBox HorizontalAlignment="Center" Margin="0 8 0 0" BorderThickness="3"/>
                    </UniformGrid>
                </DockPanel>
                <DockPanel Margin="0 0 0 30">
                    <TextBlock Text="Скриншоты" HorizontalAlignment="Center" Height="30" FontSize="20" FontWeight="Bold"/>
                </DockPanel>
                <StackPanel Orientation="Horizontal">
                    <Grid Height="250">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="1*"/>
                            <ColumnDefinition Width="1*"/>
                            <ColumnDefinition Width="1*"/>
                            <ColumnDefinition Width="1*"/>
                            <ColumnDefinition Width="1*"/>
                            <ColumnDefinition Width="1*"/>
                        </Grid.ColumnDefinitions>
                        <DockPanel Grid.Column="0" Margin="30 10 10 10">
                            <ItemsControl ItemsSource="{Binding ScreenShots}">
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                        <StackPanel>
                                            <fa:ImageAwesome Icon="{Binding ImgSours}" Height="100" Width="100"/>
                                            <TextBox Text="{Binding Text}" Width="100" Height="100"></TextBox>
                                        </StackPanel>
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                            </ItemsControl>
                        </DockPanel>
                    </Grid>
                </StackPanel>
            </StackPanel>
        </ScrollViewer>
    </Grid>
</Page>

введите сюда описание изображения

введите сюда описание изображения

aepot
  • 49,560
  • Page.DataContext - это тоже самое, что сделать DataContext = new MainViewModel(), когда вы так делаете, у вас создается новая MainViewModel, в которой по новой инициализируется страница, в которой опять создается НОВЫЙ MainViewModel, который создает страницу, и так по кругу, пока не переполнится память или не отработает защита. Вообще, вы не должны хотеть устанавливать DataContext, WPF с этим справляется самостоятельно, без вашей помощи, вам достаточно задать главному окну контекст и все. Ну и да, контекст в XAML является нарушением MVVM – EvgeniyZ Sep 27 '23 at 15:34
  • Вы вызываете конструктор Page111, он вызывает InitializeComponent, тот в свою очередь рендерит XAML, где вы вызываете view:MainViewModel, который вызывает конструктор Page111. Ссылка на дубликат в самом верху, но решение у вас другое - не создавать View внутри ViewModel, не нарушать MVVM. – aepot Sep 27 '23 at 17:51

0 Answers0