2017-08-29 104 views
1

我一直在爲此掙扎了一天左右,無法弄清楚我在這裏做錯了什麼。我希望能夠在可觀察的選項卡集合中選擇任何選項卡,並且我希望我的選擇在UI中可見。我試過SelectedIndex和SelectedItem。我可以看到我的屬性已設置,但我的選項卡未選中,UI中沒有任何反應。這裏是我的代碼:從ViewModel中選擇TabControl中的TabItem

MainWindow.xaml

<Window x:Class="WpfApplication5.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:uc="clr-namespace:WpfApplication5" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.DataContext> 
    <ViewModel xmlns="clr-namespace:WpfApplication5" /> 
</Window.DataContext> 
<StackPanel> 
    <Button Content="Select Tab Index 0" Click="Button_Click_0"/> 
    <Button Content="Select Tab Index 1" Click="Button_Click_1"/> 
    <Label Content="{Binding SelectedIndex, UpdateSourceTrigger=PropertyChanged}" /> 
    <TabControl ItemsSource="{Binding Tabs}" SelectedIndex="{Binding SelectedIndex, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"> 
     <TabControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Header}"/> 
      </DataTemplate> 
     </TabControl.ItemTemplate> 
     <TabControl.ContentTemplate> 
      <DataTemplate> 
       <uc:TabContent Content="{Binding Content}"/> 
      </DataTemplate> 
     </TabControl.ContentTemplate> 
    </TabControl> 
</StackPanel> 

MainWindow.xaml.cs

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click_0(object sender, RoutedEventArgs e) 
    { 
     var viewModel = (ViewModel)DataContext; 
     viewModel.SelectedIndex = 0; 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     var viewModel = (ViewModel)DataContext; 
     viewModel.SelectedIndex = 1; 
    } 
} 

ViewModel.cs

class ViewModel 
{ 
    private int _selectedIndex = 0; 
    public event PropertyChangedEventHandler PropertyChanged; 
    private ObservableCollection<Tab> _tabCollection = new ObservableCollection<Tab>(); 

    public ViewModel() 
    { 
     Tabs.Add(new Tab { Header = "Tab1", Content = new WpfApplication5.TabContent() }); 
     Tabs.Add(new Tab { Header = "Tab2", Content = new WpfApplication5.TabContent() }); 
    } 

    public ObservableCollection<Tab> Tabs 
    { 
     get { return _tabCollection; } 
    } 

    public int SelectedIndex 
    { 
     get { return _selectedIndex; } 
     set 
     { 
      _selectedIndex = value; 
      NotifyPropertyChanged("SelectedIndex"); 
     } 
    } 

    private void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Tab.cs

class Tab 
{ 
    public UserControl Content { get; set; } 
    public string Header { get; set; } 
} 

TabContent.xaml

<Grid> 
    <Label Content="Hello World!" /> 
</Grid> 
+1

Tab1和Tab2具有相同的內容('

+0

是的,相同的內容,我剝離了我的代碼,但選項卡標題未選中,標籤不更新... – Erika

回答

1

ViewModel類沒有實現INotifyPropertyChanged接口:

class ViewModel : INotifyPropertyChanged 
{ 
    ... 

這是你的問題。

+0

偉大的,當然。我怎麼會錯過這個..謝謝! – Erika

相關問題