2012-01-26 102 views
0

我有一個mvvm框架,非常像Josh Smith的示例。問題是我剛剛發現每次顯示視圖模型時,出於某種原因,相關的視圖構造函數都會觸發TWICE。這是在應用程序的其他地方搞砸了。當然,在這兩種情況下,調用堆棧都是空的,外部的,所以我不知道誰在做'新的'。我知道這不是我,我不會在任何地方「新」觀點。它不是重複的數據模板,因爲它甚至不允許重複的模板。當顯示視圖模型時,兩個視圖變得越來越新了

1)我怎樣才能找出誰在刷新視圖?
2)我怎樣才能迷上新視角模型之間的「魔力」,以及WPF自動幕後的幕後人物如何使用視圖並將視圖新聞?

更多信息:

就像約什 - 史密斯的例子,我有一個視圖模型的視圖相關聯的DataTemplates。就像喬什史密斯一樣,我有一組綁定到選項卡控件的視圖模型。當一個新的視圖模型被創建並添加到該集合中時,魔術盒會使用xaml中的數據模板來指出視圖,魔術盒會消息視圖,將視圖的datacontext綁定到我的視圖模型,並出現一個新選項卡。所有這些都發生在.net的幕後。我從來沒有新的看法。我只是新的視圖模型,然後將其添加到集合。

DOWN縮小到問題XAML:

如果我使用組合框,出於某種原因,導致從項目集合是的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

在構造函數中拋出異常。我敢打賭,當VS遇到它時,它會加載一個xaml文件。 – Will

+0

你在哪裏啓動ViewModel? – jcvegan

+1

在這裏沒有足夠的信息,任何人都可以幫助你。 WPF不會爲你實例化一個視圖,你必須告訴它哪個視圖使用(並實例化)*,如果你不知道這是怎麼回事,也不能解釋給我們,那就是沒辦法,我們可以幫助你。 – CodingGorilla

回答

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()」,否則你會看到兩個窗口。

+0

主窗口很好。這是表單視圖模型的視圖被稱爲兩次。應用程序窗口有一個菜單。該菜單「新聞」是一個視圖模型。它將viewmodel添加到綁定到應用程序窗口上的tabcontrol的集合。在幕後,.net然後使用我在xaml中的數據模板來查找視圖和.net幕後新聞視圖。 – happyfirst

相關問題