Шаблон MVVM в нескольких слоях с привязкой DataContext - PullRequest
0 голосов
/ 24 февраля 2019

Я работаю в приложении и использую для этого WPF UI Framework в шаблоне MVVM.

Когда я использую шаблон с MainWindow и один ContentControl работает без проблем, но когда я хочу применитьта же логика в дочернем ContentControl, я получаю эту ошибку

System.InvalidOperationException: 'Layout recursion reached allowed limit to avoid stack overflow: '2047'. Either the tree contains a loop or is too deep.'

Вот как я думаю, что пользовательский интерфейс

Главное окно открывает разделы при нажатии кнопки Изображение или Сохранить:

 <Window.Resources>
    <DataTemplate x:Name="imageViewTemplate" DataType="{x:Type viewmodels:ImageFiltersViewModel}">
        <views:ImageFiltersView DataContext="{Binding}"></views:ImageFiltersView>
    </DataTemplate>
</Window.Resources>

<Grid Background="#2A304D">
    <Grid.ColumnDefinitions>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>

    <DockPanel Grid.Row="0" Grid.Column="0">
        <StackPanel>
            <Image Source="Content/menu.png" Width="25" Margin="15" MouseLeftButtonDown="MenuViewShow"/>
        </StackPanel>
    </DockPanel>

    <DockPanel Grid.Row="1" Grid.Column="0">
        <Image Source="Content/folder.png" Width="25" Margin="15" Visibility="Visible" Name="FolderButton" />
    </DockPanel>
    <DockPanel Grid.Row="2" Grid.Column="0">
        <Image Source="Content/image.png" Width="25" Margin="15" Visibility="Visible" Name="ImageButton" MouseLeftButtonDown="ShowImageSettings">
        </Image>
    </DockPanel>
    <DockPanel Grid.Row="3" Grid.Column="0">
        <Image Source="Content/save.png" Width="25" Margin="15" Visibility="Visible" Name="SaveButton"/>
    </DockPanel>

    <ContentControl Grid.RowSpan="7" Grid.Column="1" Grid.Row="0" Grid.ColumnSpan="7" Content="{Binding}"></ContentControl>
    <!--<ContentControl Grid.ColumnSpan="6" Grid.Column="1" Grid.Row="0" Content="{Binding}"></ContentControl>-->


</Grid>

Представление фильтра изображений открывается в той же логике, но и в другом представлении:

<UserControl.Resources>
    <DataTemplate x:Name="imageViewFilterTemplate" DataType="{x:Type viewmodels:ImageFilterOptionOne}">
        <views:ImageFilterOptionOne DataContext="{Binding ElementName=ImageContentView}"></views:ImageFilterOptionOne>
    </DataTemplate>
</UserControl.Resources>

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>

    <DockPanel Grid.Row="0" Grid.Column="0">
        <StackPanel>
            <Image Source="../Content/menu.png" Width="25" Margin="15" MouseLeftButtonDown="ShowFilterOneOptions"/>
        </StackPanel>
    </DockPanel>

    <DockPanel Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="6" Grid.RowSpan="5" Background="#565555"></DockPanel>
    <ContentControl Grid.Row="6" Grid.ColumnSpan="8" Grid.Column="0" Content="{Binding}" x:Name="ImageContentView"></ContentControl>
</Grid>

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

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