我有一个像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。为什么组合会触发新视图?
答案 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()”,否则你会看到两个窗口。