显示视图模型时,两个视图正在变为新视图

时间:2012-01-26 20:39:31

标签: wpf mvvm view viewmodel datatemplate

我有一个像Josh Smith的样本很像的mvvm框架。问题是我刚刚发现每次显示一个viewmodel时,由于某种原因,相关的视图构造函数都会触发TWICE。而这在应用程序的其他地方搞乱了。当然,在这两种情况下,调用堆栈都是空的,外部的,所以我不知道谁正在做'newing'。我知道这不是我,我不会在任何地方'新'。它不是重复的数据模板,因为它甚至不允许重复的模板。

1)我怎样才能弄清楚谁在推广这个观点? 2)如何在我的视图模型新手之间加入“神奇”,当WPF自动幕后制作出什么样的视图和新闻视图?

更多信息:

就像Josh Smith的例子一样,我有一个将视图模型与视图相关联的datatemplates。就像Josh Smith一样,我有一组绑定到制表符控件的视图模型。当一个新的视图模型被创建并添加到该集合时,魔术盒使用xaml中的数据窗口来计算视图,魔术盒新闻视图,将视图的datacontext绑定到我的视图模型,并出现一个新选项卡。所有这些都发生在.net的幕后。我从来没有新观点。我只新建了viewmodel,然后将它添加到集合中。

解决问题XAML:

如果我使用ComboBox,由于某种原因,会导致从Items集合创建一个新视图,这是一个ViewModel列表。但是如果我使用菜单,则不会创建额外的视图。

<!--
<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 :(得分:0)

你没有足够的信息来获得真正的答案,所以让我们开始猜测。至少我可以向其他人解释WPF和MVVM通常如何加载Window。

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()”,否则你会看到两个窗口。