ДВА представления становятся новыми при отображении модели представления - PullRequest
0 голосов
/ 27 января 2012

У меня есть фреймворк mvvm, очень похожий на образец Джоша Смита. Проблема в том, что я только что обнаружил, что каждый раз, когда я по какой-то причине отображаю модель представления, связанный конструктор представления запускает ДВАЖДЫ. И это мешает в другом месте приложения. Конечно, в обоих случаях стек вызовов является пустым, внешним, поэтому я не могу сказать, кто делает «обновление». Я знаю, что это не я, я не «новый» взгляд нигде. Это не дубликаты шаблонов данных, потому что они даже не допускают дублирования шаблонов.

1) Как я могу выяснить, кто обновляет представление?
2) как я могу зацепиться за «магию» между обновлением моей модели представления и когда закулисное авто WPF выясняет, какой вид использовать, и отображать новости в представлении?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Так же, как пример Джоша Смита, у меня есть шаблоны данных, которые связывают модель представления с видом. Как и у Джоша Смита, у меня есть коллекция моделей, связанных с элементом управления вкладками. Когда новая модель представления создается и добавляется в эту коллекцию, волшебное поле использует шаблоны данных в xaml для определения представления, волшебное окно сообщает о представлении, привязывает текстовый вид представления к моей модели представления и появляется новая вкладка. Все это происходит за кулисами внутри .net. Я никогда не новое мнение. Я только создаю новую модель просмотра и затем добавляю ее в коллекцию.

В СХЕМЕ ЗАДАЧИ ПРОБЛЕМЫ XAML:

Если я по какой-то причине использую ComboBox, это приводит к созданию нового представления из коллекции Items, которая представляет собой список ViewModels. Но если я использую меню, дополнительный вид не создается.

<!--
<ComboBox Name="TabMenus" ItemsSource="{Binding RelativeSource= {RelativeSource FindAncestor,  AncestorType={x:Type lc:MultiStepPanel}},  Path=Items}" Width="15" Height="15" Margin="2" >
    <ComboBox.ItemContainerStyle>
        <Style TargetType="ComboBoxItem" >
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <TextBlock Text="{Binding VisibleDisplayName}"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>
-->
<Menu Name="TabMenus" Style="{StaticResource TabMenuDropDownStyle}" >
     <MenuItem Style="{StaticResource TabMenuButtonStyle}"
               ItemsSource="{Binding RelativeSource= {RelativeSource FindAncestor, AncestorType={x:Type lc:MultiStepPanel}},  Path=Items}"  
               ItemContainerStyle="{StaticResource TabMenuItem}" />
</Menu>

Оба элемента управления имеют одинаковый элемент ItemsSource xaml. Почему комбо вызывает новый вид?

1 Ответ

0 голосов
/ 27 января 2012

У вас недостаточно информации для реального ответа, поэтому давайте начнем с догадки. По крайней мере, я могу объяснить другим, как WPF и MVVM обычно загружают окно.

App.xaml обычно имеет StartupUri.

<Application x:Uid="Application_1" x:Class="WpfLocalizationExample.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml"
             >
    <Application.Resources>

    </Application.Resources>
</Application>

Это делает «новый».

Если вы используете MVVM, новое обычно делается в файле App.xaml.cs.

protected override void OnStartup(StartupEventArgs e)
    // Load the Window and View Models
    base.OnStartup(e);
    var viewmodel = new MainWindowViewModel();
    var main = new MainWindow();
    main.DataContext = viewmodel;
    main.Show();
}

Я предполагаю, что вы делаете оба, если вы видите, как запускаются два конструктора, но я также думаю, что вы не выполняете "main.Show ()", иначе вы увидите два окна.

...