实例化多个视图并将数据传递给每个视图
Instantiating multiple view and passing data to each one
我有一个棱镜应用程序,我在其中基于视图模型
中的属性在父视图的代码隐藏中实例化多个视图
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
,使用您需要的所有参数创建。
咆哮:class
不想让名字以I
开头,因为它不想被误认为是interface
!
我有一个棱镜应用程序,我在其中基于视图模型
中的属性在父视图的代码隐藏中实例化多个视图 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
,使用您需要的所有参数创建。
咆哮:class
不想让名字以I
开头,因为它不想被误认为是interface
!