wpf TabControl SelectedItem 绑定问题

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15064609/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 07:42:17  来源:igfitidea点击:

TabControl SelectedItem Binding Problems

wpfmvvmprism

提问by Hussein

In a Tabbed interface application i'm trying to pass the TabItem Header string or the object contained in the selected TabItem to the view model to use it to publish an event like this:

在选项卡式界面应用程序中,我试图将 TabItem Header 字符串或包含在所选 TabItem 中的对象传递给视图模型,以使用它来发布这样的事件:

In the View (xaml):

在视图 (xaml) 中:

<TabControl  x:Name="MyTC"
                         prism:RegionManager.RegionName="{x:Static inf:RegionNames.MainRegion}"
                         SelectedItem="{Binding Path=TabControlSelectedItem,UpdateSourceTrigger=PropertyChanged,Mode=Twoway}"
                         Cursor="Hand"
                         Grid.Row="0" 
                         Grid.Column="1">


                <TabControl.ItemTemplate>

                    <DataTemplate>
                        <!--DataContext="{Binding ElementName=MyTC, Path=SelectedItem}"-->
                        <StackPanel  Orientation="Horizontal">

                            <TextBlock VerticalAlignment="Center"
                                       Margin="3"
                                       Text="{Binding Path=DataContext.DataContext.HeaderInfo, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabItem}}}"
                                        />



                            <i:Interaction.Triggers>
                                <i:EventTrigger EventName="MouseLeftButtonDown">
                                    <i:InvokeCommandAction Command="{Binding HeaderClickCommand}"/>
                                </i:EventTrigger>
                            </i:Interaction.Triggers>


                        </StackPanel>

                    </DataTemplate>

                </TabControl.ItemTemplate>


            </TabControl>

In View Model

在视图模型中

//***********************************************************

// *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *****

     //Constructor


public ShellWindowViewModel(IEventAggregator eventAggregator)
    {
        this.eventAggregator = eventAggregator;
        this.HeaderClickCommand = new DelegateCommand(OnHeaderClick);
    }


        //SelectedItem Binding 
        private object tabControlSelectedItem;
        public object TabControlSelectedItem
        {
            get { return tabControlSelectedItem; }
            set
            {
                if (tabControlSelectedItem != value)
                {
                    tabControlSelectedItem = value;
                    OnPropertyChanged("TabControlSelectedItem");


                }
            }
        }

        //*****************************************************************************************************

        //this handler publish the Payload "SelectedSubsystem" for whoever subscribe to this event
        private void OnHeaderClick()
        {
            //EA for communication between Modules not within Modules
            string TabHeader = (TabControlSelectedItem as TabItem).Header.ToString();
            eventAggregator.GetEvent<SubsystemIDSelectedEvent>().Publish(TabHeader);

        }

but there is something wrong because when i click the TabItem nothing happen and when i inserted a breakpoint @ TabControlSelectedItem property i found it contain the view namespace.i want the TabControlSelectedItem to get the selected Tab header string or the object in the selected tab item. Your help is very much appreciated.

但是出了点问题,因为当我单击 TabItem 时什么也没有发生,当我插入断点 @ TabControlSelectedItem 属性时,我发现它包含视图命名空间。我希望 TabControlSelectedItem 获取所选选项卡标题字符串或所选选项卡项目中的对象。非常感激你的帮助。

回答by user1029697

I just tried something similar and it works fine.

我刚刚尝试了类似的东西,效果很好。

Here is my xaml

这是我的 xaml

<TabControl ItemsSource="{Binding Matches}"
    SelectedItem="{Binding SelectedRecipe}">
  <TabControl.ItemTemplate>
    <DataTemplate>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0"
                    Text="{Binding Path=Date}" />
                 <TextBlock Grid.Column="1"
                    TextAlignment="Center"
             Text="{Binding Path=Name}" />
        </Grid>
    </DataTemplate>
  </TabControl.ItemTemplate>
</TabControl>

And then in my viewmodel

然后在我的视图模型中

public object SelectedRecipe
{
  get
  {
    return _selectedRecipe;
  }
  set
  {
    _selectedRecipe = value;
    OnNotifyPropertyChanged("SelectedRecipe");
  }
}