在使用View绑定时从ContentTemplate访问ViewModel的ObservableCollection

时间:2014-09-22 19:17:00

标签: c# wpf mvvm collections observablecollection

  1. 我有2个视图和ViewModel名为 SummaryView SummaryViewModel DetailsView DetailsViewModel
  2. 我在 SummaryViewModel 中创建了 ObservableCollection 属性。
  3. 以下代码位于 SummaryView 中以访问该集合并将其与View绑定。
  4. =============================================== ===================================

    <TabControl ItemsSource="{Binding Path=DetailsViewModelCollection}">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <HeaderedContentControl>
                    <TextBlock Text="{Binding Path=TabNameICanAccessTheItemsFromCollectionHere.}"/>
                </HeaderedContentControl>
            </DataTemplate>
        </TabControl.ItemTemplate>
    
        <TabControl.ContentTemplate>
            <DataTemplate>
                <LocalViews:InventoryDetailsView DataContext="HowCanIAccessItemsFromCollection"/>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>
    

    问题:

    无法访问 ObservableCollection 中的项目到 ContentTemplate 。 但是能够访问 ItemTemplate 中的项目。

    更多详情:

    1. 一旦用户点击,我在SummaryView中有一个按钮我通过调用参数化构造函数将项目添加到DetailsViewModelCollection。
    2. 集合已成功创建,我可以访问ItemTemplate部分中的每个项目及其属性。 例如。我可以看到正在创建多个选项卡,并且不同的TabName名称来自该集合。
    3. 但From ContentTemplate部分触发整个集合的DetailsViewModel的默认构造函数,并且该实例将绑定到所有选项卡。
    4. 我使用了这里的示例和源代码。 http://tap-source.com/mvvm-tabcontrol/ 我可能会做一些愚蠢的约束错误,但无法弄明白。

      谢谢。

1 个答案:

答案 0 :(得分:0)

我想出了这个问题。

作为常规进程在DetailsView中,我将DataContext指定为DetailsViewModel。 这就是为什么添加新选项卡时,会创建一个新的可为空的实例并绑定到它。当我删除DataContext时,问题得到了解决。

我还在MSDN中为其他人发布了一个简单的例子,如果他们遇到类似的错误。