在tabcontrol中将datacontext分配给自动生成的tabitem

时间:2014-09-25 08:36:17

标签: c# wpf

我正在尝试从TabItem将对象分配给datacontext。要了解一下,请查看以下代码示例

<UserControl x:Class="CustomCopyNas.UserControls.LoginUsers"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:igWindows="http://infragistics.com/Windows"
             mc:Ignorable="d"
             d:DesignHeight="300" d:DesignWidth="300">

    <Grid Margin="5,0,5,0">
        <igWindows:XamTabControl Name="_xamTabControl"
             TabLayoutStyle="MultiRowSizeToFit"
             MaximumTabRows="4"
             MaximumSizeToFitAdjustment="50"
             MinimumTabExtent="100"
             InterTabSpacing="2"
             InterRowSpacing="2"
             Theme="Metro" 
             AllowTabClosing="False"
             TabItemCloseButtonVisibility="WhenSelectedOrHotTracked">
            <igWindows:XamTabControl.ContentTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Prop}"/>
                </DataTemplate>
            </igWindows:XamTabControl.ContentTemplate>
        </igWindows:XamTabControl>
    </Grid>
</UserControl>

如您所见,我使用datatemplate作为TabItem内容外观,TextBox。 TextBox Text属性绑定到datacontext的属性。

来自UserControl的部分类

public class Foo
{
    public string Prop {
        get { return "Hello Foo"; }
    }
}

/// <summary>
/// Interaction logic for LoginUsers.xaml
/// </summary>
public partial class LoginUsers : UserControl
{
    public LoginViewModel LoginViewModel = new LoginViewModel("file.xml");

    public LoginUsers()
    {
        InitializeComponent();

        foreach (var server in LoginViewModel.ServerUsers)
        {
            string header = server.Server;
            string name = "tabItem" + header;
            _xamTabControl.Items.Add(new TabItemEx() { Header = header, Name = name, DataContext = new Foo() });
        }
    }
}

作为TabItem内容的输出我什么都没有,所以emtpy内容,为什么?

2 个答案:

答案 0 :(得分:1)

您似乎没有正确宣布您的TabControl XAML。通常使用TabControl.ItemsSource属性来看待它更像这样定义:

<TabControl ItemsSource="{Binding YourCollectionProperty}">
    <TabControl.ItemTemplate> <!-- Header Template-->
        <DataTemplate>
            <TextBlock Text="{Binding HeaderText}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate> <!-- Body Template-->
        <DataTemplate>
            <TextBlock Text="{Binding BodyText}" />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

要实现此目的,您需要创建一个包含HeaderTextBodyText属性的自定义类。然后,您需要在名为public ObservableCollection<YourCustomClass>的代码中创建一个YourCollectionProperty集合属性。

请注意,两个Binding内的DataTemplate会自动将DataContext设置为YourCollectionProperty集合中的项目,这就是您的Binding { {1}} Prop属性无效。

答案 1 :(得分:0)

尝试移动foreach循环,以便在_xamTabControl.Loaded事件触发时触发。那应该是诀窍