2017-08-29 15 views
1

私はこれを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 : INotifyPropertyChanged 
{ 
    ... 
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インタフェースを実装していませんそれはあなたの問題です。

+0

もちろん、素晴らしいです。どうして私はそれを見逃すことができた..ありがとう! – Erika

関連する問題