问题描述
我有一个棱镜应用程序,我根据视图模型中的属性在父视图的代码隐藏中实例化多个视图
public I2CNavigatorView()
{
InitializeComponent();
var viewmodel = (I2CNavigatorviewmodel) DataContext;
for (int i = 0; i < viewmodel.NumberOfI2C; i++)
{
var i2CTabItem = new TabItem
{
Header = "I2C " + i,Content = new I2CView(i)
};
NavigatorTabs.Items.Add(i2CTabItem);
}
}
并且我需要将索引传递给每个子视图的视图模型,因此我当前的解决方案是在实例化视图并在其视图模型中设置变量时将索引作为参数传递给视图
public I2CView(int currentI2CIndex)
{
InitializeComponent();
var viewmodel = (I2Cviewmodel) DataContext;
viewmodel.CurrentI2CIndex = currentI2CIndex;
}
但是我对解决方案不是很满意,因为数据流的路径是:父视图->子视图-> 子视图模型,而我需要它是:父视图 -> 子视图模型
所以我在想“有没有办法在实例化视图时将数据直接传递给视图模型?”
请指教, 提前致谢
解决方法
我将从视图模型开始:
internal class I2CNavigatorViewModel
{
public IReadOnlyCollection<I2CViewModel> MyItems { get; }
}
<TabControl ItemsSource="{Binding MyItems}">
<TabControl.ContentTemplate>
<DataTemplate>
<I2CView />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
然后用子视图模型初始化 MyItems
,用你需要的所有参数创建。
Rant:class
不想让它的名字以 I
开头,因为它不喜欢被误认为是 interface
!