2013-11-23 4 views
0

Я очень новичок в MVVM и WPF. Я пытаюсь создать tabcontrol с вкладками, представленными как usercontrols, и я не могу найти причину, по которой пользовательские элементы не загружаются, когда я переключаюсь между вкладками.UserControls/ViewModels не загружаются при переключении вкладок

public partial class WndMain : Window 
{ 
    public WndMain() 
    { 
     InitializeComponent(); 

     var ViewModelWndMain = new ViewModelWndMain(); 

     this.DataContext = ViewModelWndMain; 
    } 
} 

Каждый TabItem имеет собственную ViewModel:

<Window x:Class="EasyBulking.WndMain" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ViewModels="clr-namespace:EasyBulking.ViewModels" 
    xmlns:Tabs="clr-namespace:EasyBulking.GUI" 
    Title="WndMain" Height="350" Width="525"> 
<Grid> 
    <TabControl x:Name="TabsWndMain" 
     ItemsSource="{Binding Tabs}" 
     SelectedItem="{Binding SelectedTab, Mode=TwoWay}"> 

     <TabControl.Resources>     
      <DataTemplate DataType="{x:Type ViewModels:ViewModelTabProfile}"> 
       <Tabs:TabProfile /> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type ViewModels:ViewModelTabNutrition}"> 
       <Tabs:TabNutrition /> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type ViewModels:ViewModelTabTraining}"> 
       <Tabs:TabTraining /> 
      </DataTemplate>    
     </TabControl.Resources> 

     <TabControl.ItemContainerStyle> 
      <Style TargetType="TabItem"> 
       <Setter Property="Header" Value="{Binding tabName}" /> 
      </Style> 
     </TabControl.ItemContainerStyle> 

    </TabControl> 
</Grid> 

Соответствующий ViewModel:

class ViewModelWndMain : ViewModelBase 
{   
    private ObservableCollection<ViewModelTab> tabs = new ObservableCollection<ViewModelTab>(); 
    private ViewModelTab selectedTab; 
    private ResourceManager resourceManager { get; set; } 

    public ViewModelWndMain() 
    { 
     resourceManager = new ResourceManager("EasyBulking.Properties.Resources", Assembly.GetExecutingAssembly()); 

     Tabs.Add(new ViewModelTabProfile(resourceManager.GetString("tabProfile"))); 
     Tabs.Add(new ViewModelTabProfile(resourceManager.GetString("tabNutrition"))); 
     Tabs.Add(new ViewModelTabProfile(resourceManager.GetString("tabTraining"))); 

     SelectedTab = Tabs[0]; 
    } 

    public ObservableCollection<ViewModelTab> Tabs 
    { 
     get 
     { 
      return tabs; 
     } 
    } 

    public ViewModelTab SelectedTab 
    { 
     get { return selectedTab; } 
     set { 
      selectedTab = value; 
      this.RaisePropertyChangedEvent("SelectedTab");    
     } 
    } 
} 

Пожары событий ProperyChanged, но интерфейс просто не обновляется, когда я переключите вкладки.

abstract class ViewModelBase : INotifyPropertyChanged 
{ 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void RaisePropertyChangedEvent(string propertyName) 
    {   
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+0

Я думаю, что в вашем элементе Window XAML отсутствует атрибут DataContext = "{Binding RelativeSource = Self}" ... –

+0

Если я добавлю это свойство DataContext = "{Binding RelativeSource = {RelativeSource Self}} в мою вкладку, управляйте моим окном ничего не будет отображаться вообще - даже заголовки вкладок. – JuergenP

+0

Argh ... извините, не обратил внимания на очевидное: вы добавляете три объекта типа «ViewModelTabProfile» вместо отдельных других объектов. Ваши вкладки, вероятно, переключаются, но к тому же контроль снова и снова –

ответ

0

КИ, только чтобы закрыть этот вопрос на очередной ответ, здесь мы идем:

код, который добавляет ViewModels Вкладки вставляет одни и те же объекты для всех трех закладок:

Tabs.Add(new ViewModelTabProfile(resourceManager.GetString("tabProfile"))); 
    Tabs.Add(new ViewModelTabProfile(resourceManager.GetString("tabNutrition"))); 
    Tabs.Add(new ViewModelTabProfile(resourceManager.GetString("tabTraining"))); 

Загруженный ресурсом текст заголовка маскирует этот факт, и кажется, что страницы не меняются, когда на самом деле они снова переключаются с одного элемента управления на тот же тип управления.

Смежные вопросы