如何从我的 ViewModel 跟踪所选 TabPage 的 DataContext?

发布于 2024-12-15 12:45:11 字数 1757 浏览 2 评论 0原文

我有 TabItem 类:

 public class TabItem
{
    public string Header { get; set; }
    public IView Content { get; set; }
}

在我的模型中:

 public ObservableCollection<TabItem> Tabs
    {
        get { return _tabs; }
        set
        {
            if(_tabs!=value)
            {
                _tabs = value;
                RaisePropertyChanged("Tabs");
            }
        }
    }

    public TabItem CurrentTabItem
    {
        get { return _currentTabItem; }
        set
        {
            if (_currentTabItem != value)
            {
            }
            _currentTabItem = value;
            RaisePropertyChanged("CurrentTabItem");
        }
    }

在视图中我绑定到 ModelView:

<TabControl x:Name="shellTabControl" ItemsSource="{Binding Tabs}" 
            IsSynchronizedWithCurrentItem="True" SelectionChanged="ShellTabControlSelectionChanged">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Header}"/>
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <ContentPresenter Content="{Binding Content}"/>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

从视图中我想更改 ViewModel 的 CurrentTabItem 属性:

 private void ShellTabControlSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if(e.Source is TabItem)
        {
            var tabItem = e.Source as TabItem;
            ViewModel.CurrentTabItem = tabItem; //don't work
        }
    }

将 TabControl 的 TabItem 转换为我的 TabItem 的最佳方法是什么?

I have TabItem class:

 public class TabItem
{
    public string Header { get; set; }
    public IView Content { get; set; }
}

and in my model:

 public ObservableCollection<TabItem> Tabs
    {
        get { return _tabs; }
        set
        {
            if(_tabs!=value)
            {
                _tabs = value;
                RaisePropertyChanged("Tabs");
            }
        }
    }

    public TabItem CurrentTabItem
    {
        get { return _currentTabItem; }
        set
        {
            if (_currentTabItem != value)
            {
            }
            _currentTabItem = value;
            RaisePropertyChanged("CurrentTabItem");
        }
    }

In View i'm binding to ModelView:

<TabControl x:Name="shellTabControl" ItemsSource="{Binding Tabs}" 
            IsSynchronizedWithCurrentItem="True" SelectionChanged="ShellTabControlSelectionChanged">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Header}"/>
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <ContentPresenter Content="{Binding Content}"/>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

From view i want to change ViewModel's CurrentTabItem property:

 private void ShellTabControlSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if(e.Source is TabItem)
        {
            var tabItem = e.Source as TabItem;
            ViewModel.CurrentTabItem = tabItem; //don't work
        }
    }

What is the best approach to convert TabControl's TabItem to my TabItem?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

酷炫老祖宗 2024-12-22 12:45:11

也许使用 SelectedItem="{Binding CurrentTabItem, Mode=TwoWay, UpdateSourceTrigget=PropertyChanged}" 更好?

Maybe it is better to use SelectedItem="{Binding CurrentTabItem, Mode=TwoWay, UpdateSourceTrigget=PropertyChanged}"?

天赋异禀 2024-12-22 12:45:11
<TabControl x:Name="shellTabControl" ItemsSource="{Binding Tabs}" 
          IsSynchronizedWithCurrentItem="True"
          SelectionChanged="ShellTabControlSelectionChanged" 
          SelectedItem={Binding Path=CurrentTabItem,Mode=Twoway}>      
  <TabControl.ItemTemplate>          
    <DataTemplate>              
      <TextBlock Text="{Binding Header}"/>          
    </DataTemplate>      
  </TabControl.ItemTemplate>      
 <TabControl.ContentTemplate>          
   <DataTemplate>              
     <ContentPresenter Content="{Binding Content}"/>          
   </DataTemplate>      
 </TabControl.ContentTemplate>  
</TabControl>  

这将为您提供所选的 TabItem.......

还可以更改您的自定义“TabItem”的名称,这很令人困惑;)

<TabControl x:Name="shellTabControl" ItemsSource="{Binding Tabs}" 
          IsSynchronizedWithCurrentItem="True"
          SelectionChanged="ShellTabControlSelectionChanged" 
          SelectedItem={Binding Path=CurrentTabItem,Mode=Twoway}>      
  <TabControl.ItemTemplate>          
    <DataTemplate>              
      <TextBlock Text="{Binding Header}"/>          
    </DataTemplate>      
  </TabControl.ItemTemplate>      
 <TabControl.ContentTemplate>          
   <DataTemplate>              
     <ContentPresenter Content="{Binding Content}"/>          
   </DataTemplate>      
 </TabControl.ContentTemplate>  
</TabControl>  

This will get you the selected TabItem.......

Also change the Name of your Custom "TabItem" its confusing ;)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文