【问题标题】:How to correctly databind collection to TabControl?如何正确地将集合数据绑定到 TabControl?
【发布时间】:2014-06-20 02:24:31
【问题描述】:

我查看了关于 SO 的几个问题/答案,但由于某种原因,我没有任何工作可以将集合绑定到 TabControl。我正在尝试这样做,所以我没有在代码隐藏中分配DataContext

这是视图模型:

public class DocumentsCollectionViewModel : IEnumerable<DocumentViewModel> {

    private readonly ObservableCollection<DocumentViewModel> mDocsCollection = new ObservableCollection<DocumentViewModel>();

    public ObservableCollection<DocumentViewModel> Documents {
        get { return mDocsCollection; }
    }

    // initially excluded from question as I thought it was understood :)
    public IEnumerator<DocumentViewModel> GetEnumerator() {
        return mDocsCollection.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator() {
        return mDocsCollection.GetEnumerator();
    }

}

...为了完整起见,DocumentViewModel

public class DocumentViewModel {

    private readonly Document mDocument;


    public string Name {
        get { return mDocument.Name; }
    }

}

在 XAML 中,我有点困惑在哪里告诉选项卡控件使用 DocumentsCollectionViewModel 中的 Documents 属性:

<TabControl Name="DocumentsTab"
            ItemsSource="{Binding localmodels:DocumentsCollectionViewModel}">
    <TabControl.ItemTemplate>
        <DataTemplate DataType="{x:Type localmodels:DocumentViewModel}">
            <Label Style="{StaticResource DefaultFont}"
                   Content="{Binding Name}"/>
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate DataType="{x:Type localmodels:DocumentViewModel}">
            <Label Style="{StaticResource DefaultFont}"
                   Content="{Binding Name}"/>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

【问题讨论】:

    标签: c# wpf data-binding tabcontrol


    【解决方案1】:

    您是否将具有此TabControlWindow/UserControl 的DataContext 设置为DocumentsCollectionViewModel 的实例?

    尝试在包含 TabControl 的窗口的构造函数中执行此操作

    public void MainWindow()
    {
    
         InitializeComponents();
         this.DataContext = new DocumentsCollectionViewModel();
         //Initialize the collection inside your VM
    }
    

    或者您可以在 xaml 中设置 DataContext,例如

    <Window>
       <Window.DataContext>
           <localmodels:DocumentsCollectionViewModel/>
       </Window.DataContext>
    </Window>
    

    然后在您的 xaml 中直接绑定到 Documents 属性

    <TabControl Name="DocumentsTab"
            ItemsSource="{Binding Documents}">
        <TabControl.ItemTemplate>
            <DataTemplate DataType="{x:Type localmodels:DocumentViewModel}">
                <Label Style="{StaticResource DefaultFont}"
                       Content="{Binding Name}"/>
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate DataType="{x:Type localmodels:DocumentViewModel}">
                <Label Style="{StaticResource DefaultFont}"
                       Content="{Binding Name}"/>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>
    

    【讨论】:

    • 这可行,但我因手动设置DataContext而受到严厉谴责。
    • @IAbstract 您可以在 xaml 中设置 DataContext,如更新的答案中所示
    • 啊,很好。执行此操作时,会创建一个 DocumentsCollectionViewModel 实例,但该实例 live 在哪里?比如说,我什么时候想将文档添加到集合中?
    猜你喜欢
    • 2011-08-04
    • 2011-04-07
    • 2012-12-10
    • 2023-03-29
    • 2019-06-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    相关资源
    最近更新 更多