如何將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的類型,因此視圖將放置在正確的區域中
慕婉清6462132
TA貢獻1804條經驗 獲得超2個贊
我有一個轉換器來解耦UI和ViewModel,這就是以下幾點:
<TabControl.ContentTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding Tab,Converter={StaticResource TabItemConverter}"/>
</DataTemplate></TabControl.ContentTemplate>Tab是我的TabItemViewModel中的枚舉,TabItemConverter將其轉換為真實的UI。
在TabItemConverter中,只需獲取值并返回所需的用戶控件。
添加回答
舉報
0/150
提交
取消
