Почему ItemsControl показывает представление, а ContentControl ничего не показывает?

У меня есть приложение на основе Prism.

Это моя оболочка:

<Window x:Class="AvarioCRM3.ShellV2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:cal="http://www.codeplex.com/CompositeWPF" >

    <DockPanel LastChildFill="True">
        <Border
            Padding="10"
            DockPanel.Dock="Top"
            Background="#ddd">
            <DockPanel>
                <ItemsControl 
                    Name="MainNavigationPanel" 
                    cal:RegionManager.RegionName="MainNavigationPanel" 
                    DockPanel.Dock="Top"/>

            </DockPanel>
        </Border>
    </DockPanel>

</Window>

В моем MenuModule я добавляю вид на регион, и он показывает нормально:

public void Initialize()
{
    MainNavigationPresenter mainNavigationPresenter = this.container.Resolve<MainNavigationPresenter>();
    IRegion mainRegion = this.regionManager.Regions["MainNavigationPanel"];
    mainRegion.Add(new TestView());
}

Проблема в том, что я не хочу ItemsControl в моей оболочке, я хочу ContentControl, но когда я использую ContentControl, он ничего не показывает.

Почему ItemsControl показывает мои представления, а ContentControl ничего не показывает?

3 ответа

В отличие от ItemsControl с ContentControl, вам также необходимо активировать представление, как только вы добавили его, чтобы сделать его видимым.

MainNavigationPresenter mainNavigationPresenter = this.container.Resolve<MainNavigationPresenter>();
IRegion mainRegion = this.regionManager.Regions["MainNavigationPanel"];
TestView view = new TestView()
mainRegion.Add(view);
mainRegion.Activate(view);

Может ли это быть потому, что ContentControl будет отображать только один дочерний элемент, тогда как ItemsControl имеет несколько дочерних элементов?

Я не работал с Prism, но API предполагает, что у IRegion должно быть несколько детей. Если вы используете ContentControl, то, когда я делаю следующее, немного двусмысленно:

IRegion mainRegion = this.regionManager.Regions["MainNavigationPanel"];
mainRegion.Add(new TestView());
mainRegion.Add(new SecondTestView());

Я заметил, что вы делаете это в Initialize. Может быть слишком рано? Вы пытались использовать регистрацию, а не инъекцию своего взгляда, чтобы увидеть, изменилось ли это что-нибудь?

regionManager.RegisterViewWithRegion("MainNavigationPanel", typeof(TestView));

Это не решит вашу проблему, однако докажет, что проблема пытается что-то добавить до того, как ваш регион будет фактически доступен. RegisterViewWithRegion будет задерживать создание и отображение представления, пока регион не станет доступным.

Другие вопросы по тегам