为了账号安全,请及时绑定邮箱和手机立即绑定

如何将TabControl绑定到ViewModels集合?

如何将TabControl绑定到ViewModels集合?

如何将TabControl绑定到ViewModels集合?基本上我在我的MainViewModel.cs中:ObservableCollection<TabItem> MyTabs { get; private set; }但是,我需要以某种方式不仅能够创建选项卡,而且还可以在维护MVVM的同时加载选项卡内容并将其链接到适当的视图模型。基本上,我如何将用户控件作为tabitem的内容加载并将该usercontrol连接到适当的viewmodel。使这个困难的部分是ViewModel不应该构造实际的视图项,对吧?或者可以吗?基本上,这是MVVM合适的:UserControl address = new AddressControl(); NotificationObject vm = new AddressViewModel(); address.DataContext = vm; MyTabs[0] = new TabItem() {     Content = address; }我只是问,因为我正在ViewModel中构建一个View(AddressControl),这对我来说听起来像MVVM禁忌。
查看完整描述

3 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

在Prism中,您通常会将选项卡控件设置为一个区域,这样您就不必控制绑定的选项卡页面集合。

<TabControl 
    x:Name="MainRegionHost"
    Regions:RegionManager.RegionName="MainRegion" 
    />

现在可以通过将自身注册到MainRegion区域来添加视图:

RegionManager.RegisterViewWithRegion( "MainRegion", 
    ( ) => Container.Resolve<IMyViewModel>( ).View );

在这里你可以看到Prism的特色。视图由ViewModel实例化。在我的情况下,我通过Inversion of Control容器(例如Unity或MEF)解析ViewModel。ViewModel通过构造函数注入获取View注入,并将自身设置为View的数据上下文。

另一种方法是将视图的类型注册到区域控制器中:

RegionManager.RegisterViewWithRegion( "MainRegion", typeof( MyView ) );

使用此方法允许您稍后在运行时创建视图,例如通过控制器:

IRegion region = this._regionManager.Regions["MainRegion"];

object mainView = region.GetView( MainViewName );
if ( mainView == null )
{
    var view = _container.ResolveSessionRelatedView<MainView>( );
    region.Add( view, MainViewName );
}

由于您已注册View的类型,因此视图将放置在正确的区域中

查看完整回答
反对 回复 2019-08-02
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

我有一个转换器来解耦UI和ViewModel,这就是以下几点:

<TabControl.ContentTemplate>
    <DataTemplate>
        <ContentPresenter Content="{Binding Tab,Converter={StaticResource TabItemConverter}"/>
    </DataTemplate></TabControl.ContentTemplate>

Tab是我的TabItemViewModel中的枚举,TabItemConverter将其转换为真实的UI。

在TabItemConverter中,只需获取值并返回所需的用户控件。


查看完整回答
反对 回复 2019-08-02
  • 3 回答
  • 0 关注
  • 846 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信