3 回答
TA贡献1772条经验 获得超5个赞
这就是我满足这种要求的方式:视图:
<Window.DataContext>
<local:MainWIndowViewModel/>
</Window.DataContext>
<Grid>
<TabControl Name="tc" ItemsSource="{Binding vms}">
<TabControl.Resources>
<DataTemplate DataType="{x:Type local:uc1vm}">
<local:UserControl1/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:uc2vm}">
<local:UserControl2/>
</DataTemplate>
</TabControl.Resources>
<TabControl.ItemContainerStyle>
<Style TargetType="TabItem">
<Setter Property="Header" Value="{Binding TabHeading}"/>
</Style>
</TabControl.ItemContainerStyle>
</TabControl>
</Grid>
</Window>
当它具有uc1vm时,它将被模板化到视图中的usercontrol1中。
我将绑定到全部实现一个接口的视图模型的集合,因此我确定可以将其强制转换并调用方法。
窗口的主要视图模型:
private IDoSomething selectedVM;
public IDoSomething SelectedVM
{
get { return selectedVM; }
set
{
selectedVM = value;
selectedVM.doit();
RaisePropertyChanged();
}
}
public ObservableCollection<IDoSomething> vms { get; set; } = new ObservableCollection<IDoSomething>
{ new uc1vm(),
new uc2vm()
};
public MainWIndowViewModel()
{
}
选择选项卡后,所选项目的设置器将被传递新值。强制转换并调用方法。
我的界面非常简单,因为这只是说明性的:
public interface IDoSomething
{
void doit();
}
一个示例视图模型,它只是说明性的,并没有做很多事情:
public class uc1vm : IDoSomething
{
public string TabHeading { get; set; } = "Uc1";
public void doit()
{
// Your code goes here
}
}
- 3 回答
- 0 关注
- 295 浏览
添加回答
举报