使用各种ViewModel重用TabControl中的UserControl

时间:2015-07-18 03:08:43

标签: c# wpf xaml mvvm user-controls

我有一个用户控件,我想重用多个ViewModel,它们都实现了相同的接口。我想将这些嵌入TabControl中。

目前我可以为单个实例执行此操作,但我正在努力重用我的UserControl。对于单个实例,我可以在UserContol的xaml中绑定ViewModel或在后面的代码中实例化它,但是我无法弄清楚如何从更高级别设置它。

这就是我所拥有的,

      <TabControl HorizontalAlignment="Left" Height="800" Margin="0,0,0,0" VerticalAlignment="Top" Width="600">
        <TabItem Header="Tab1">
            <Frame Source="SomeUserControl.xaml"  BorderThickness="0" Margin="0" />
        </TabItem>
    </TabControl>

这是我想要实现的伪代码,

      <TabControl>
        <TabItem Header="Tab1">
            <Frame Source="{SomeUserControl.xaml, DataContext=ViewModel1}" />
        </TabItem>
        <TabItem Header="Tab2">
            <Frame Source="{SomeUserControl.xaml, DataContext=ViewModel2}" />
        </TabItem>
    </TabControl>

谢谢!

2 个答案:

答案 0 :(得分:0)

不是对选项卡进行硬编码,而是绑定到“item”类的ObservableCollection。即

之类的东西
send

创建一个:

class Foo
  def self.bar
    "bar"
  end

  def baz
    "baz"
  end
end

Foo.send(:bar) # => "bar"
f = Foo.new
f.send(:baz) # => "baz"

将TabControl ItemsSource绑定到ObservableCollection。在TabControl的项模板中,将Header绑定到Header属性,将DataContext绑定到DataContext属性。源可以在模板中进行硬编码,或者您可以将另一个属性添加到项类中,并在需要更多灵活性时将其绑定到该类。

答案 1 :(得分:0)

感谢SledgeHammer的回答,我能够采取不同的方法让事情发挥作用。

        <TabControl Name="TabControl" ItemsSource="{Binding TabItems}" HorizontalAlignment="Left" Height="800" Margin="0,0,0,0" VerticalAlignment="Top" Width="600">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Header}"/>
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <UserControl Content="{Binding DataContext}"/>
            </DataTemplate>
        </TabControl.ContentTemplate>

TabItems填充在与上面的xaml关联的代码中。

    this.TabItems = new ObservableCollection<TabItem>
    {
        new TabItem("Main", new MainControl()), 
        new TabItem("Tab1", new GenericTabControl(new ViewModel1())),
        new TabItem("Tab2", new GenericTabControl(new ViewModel2()))
    };