【问题标题】:Instantiating multiple view and passing data to each one实例化多个视图并将数据传递给每个视图
【发布时间】:2021-07-24 12:44:30
【问题描述】:

我有一个 prism 应用程序,我在其中基于视图模型中的属性在父视图的代码隐藏中实例化多个视图

    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;
    }

但我对解决方案不太满意,因为数据流路径是:父视图 -> 子视图 -> 子视图模型,而我需要它是:父视图->子视图模型

所以我在想“有没有办法在实例化视图时将数据直接传递给视图模型?”

请指教, 提前致谢

【问题讨论】:

  • 你为什么在I2CNavigatorView而不是I2CNavigatorViewModel这样做?当然,NavigatorTabs 有一个像 ItemsSource 这样的依赖属性,您可以绑定到视图模型上的属性?
  • @Haukinger NavigatorTabs 只是一个标签控件,也请你写一个答案澄清一下
  • 我的评论更像是一个问题(关于你为什么将逻辑放在视图中)而不是一个答案......
  • @Haukinger,哦,我是从I2CNavigatorView 这样做的,因为我无法从视图模型实例化视图,如果我按照你提到的方式进行操作,我将不会能够将任何参数传递给我真正需要做的子视图或子视图模型
  • I can not instantiate a view from the viewmodel - 这不是DataTemplate 的作用吗?

标签: c# wpf mvvm code-behind


【解决方案1】:

我将从视图模型开始:

internal class I2CNavigatorViewModel
{
    public IReadOnlyCollection<I2CViewModel> MyItems { get; }
}

<TabControl ItemsSource="{Binding MyItems}">
    <TabControl.ContentTemplate>
        <DataTemplate>
            <I2CView />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

然后只需使用您需要的所有参数创建的子视图模型初始化MyItems

咆哮:class 不想让它的名字以I 开头,因为它不喜欢被误认为是interface

【讨论】:

  • 这段代码输出一团糟,tabControl必须为每个选项卡包含一个tabItem(它没有ItemsSource属性),使用你提到的代码只是使用itemsSource中的第一项作为选项卡的标题并将所有其他项目放在类似堆栈面板的视图中,这不是我想要的,我希望它为 itemsSource 中的每个项目添加一个选项卡项目
  • 你确定这段代码有效还是我做错了什么
  • @technologyworld 你说得对,TabControl.ItemTemplate 是标签页头,TabControl.ContentTemplate 是实际标签内容。
  • 这确实有效,但我有第二个问题,我想在动态I2CView 之前有两个固定标签,那我该怎么办?
  • 是什么阻止您将固定选项卡的视图模型放入集合中?只需将其设为IReadOnlyCollection&lt;object&gt; 就可以了。如果没有,请发布一个新问题 :-)
猜你喜欢
  • 1970-01-01
  • 2018-12-08
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 2011-10-01
  • 1970-01-01
相关资源
最近更新 更多