如何在不违反MVVM模式的情况下从WPF中的TabControl更改Tab

Joe*_*oel 8 c# wpf design-patterns mvvm mvvm-light

我的WPF Windows包含一个TabControl,它显示不同选项卡上的内容.单击下面的按钮可通过ICommand接口/ Binding执行方法.被调用的方法生成要在第二个选项卡中显示的文本.

应用程序样机

如何在不违反MVVM模式的情况下切换到按钮单击时的第二个选项卡?

我试图将TabItem.IsSelected属性绑定到我的ViewModel中的某些内容,但我也想使用其他标签(tab1).

有什么想法吗?

Joe*_*oel 14

我自己发现了它.

关键是双向绑定.单击该按钮时,它将属性设置为DisplayXamlTabtrue.该IsSelected属性绑定到此变量.如果单击另一个选项卡,绑定将DisplayXamlTab属性设置为false.

注意:UpdateSourceTrigger=PropertyChanged也很重要

代码如下:

XAML:

        <TabItem Header="XAML" IsSelected="{Binding DisplayXamlTab, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <Grid Background="#FFE5E5E5">
                <TextBox x:Name="TxtXamlOutput" IsReadOnly="True" Text="{Binding XamlText, Mode=TwoWay, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" AcceptsReturn="True" TextWrapping="Wrap" VerticalScrollBarVisibility="Visible"/>
            </Grid>
        </TabItem>
Run Code Online (Sandbox Code Playgroud)

C#属性:

private bool displayXamlTab;
public bool DisplayXamlTab
{
    get { return this.displayXamlTab; }
    set
    {
        this.displayXamlTab = value;
        this.RaisePropertyChanged("DisplayXamlTab");
    }
}
Run Code Online (Sandbox Code Playgroud)


sim*_*im1 12

如果您要使用MVVM方式,那么您将在后面的代码中创建两个依赖项属性:

  • ObservableCollection<ItemType> Items;
  • ItemType MySelectedItem;

然后,将TabControl ItemsSource属性绑定到Items并将SelectedItem属性绑定到MySelectedItem

    <TabControl ItemsSource="{Binding Items}"
        SelectedItem="{Binding MySelectedItem, Mode=TwoWay}">
<TabControl.ItemTemplate>
    <DataTemplate>
        <... here goes the UI to display ItemType ... >
    </DataTemplate>
  </TabControl.ItemTemplate>
</TabControl>
Run Code Online (Sandbox Code Playgroud)

如果要更改选定的选项卡,只需更新MySelectedItem依赖属性即可