我有一个用户控件,我想重用多个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>
谢谢!
答案 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()))
};