Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# wpf帮助将数据绑定到TabControl中的控件_C#_Wpf_Xaml_Data Binding_Tabcontrol - Fatal编程技术网

C# wpf帮助将数据绑定到TabControl中的控件

C# wpf帮助将数据绑定到TabControl中的控件,c#,wpf,xaml,data-binding,tabcontrol,C#,Wpf,Xaml,Data Binding,Tabcontrol,因此,我有一个带有两个TabItems的TabControl,每个TabItem上都有相同的控件(8个TextBlocks),并且将在与另一个TabItem上的对应控件相同的绑定下显示数据。 下面是我拥有的xaml和cs代码,但当我尝试执行它时,会出现此错误 在使用ItemsSource之前,Items集合必须为空 TabItem结构的XAML C#用于绑定数据 公共类选项卡ItemContent { 公共字符串地址{get;set;} 公共字符串上速度{get;set;} 公共字符串发行版

因此,我有一个带有两个TabItems的TabControl,每个TabItem上都有相同的控件(8个TextBlocks),并且将在与另一个TabItem上的对应控件相同的绑定下显示数据。 下面是我拥有的xaml和cs代码,但当我尝试执行它时,会出现此错误

在使用ItemsSource之前,Items集合必须为空

TabItem结构的XAML

C#用于绑定数据
公共类选项卡ItemContent
{
公共字符串地址{get;set;}
公共字符串上速度{get;set;}
公共字符串发行版{get;set;}
公共字符串TimeLow{get;set;}
公共字符串TimeMed{get;set;}
公共字符串TimeHigh{get;set;}
公共字符串TimeSprint{get;set;}
公共字符串DistSprint{get;set;}
}
公共图书馆
{
//所有这些都是一行代码
//FileLoadData是存储我的所有数据的另一个类的列表
var tabitemcontents=new List{new TabItemContent{vention=FileLoadData[0]。vention,TopSpeed=FileLoadData[0]。TopSpeed.ToString(),DistRun=FileLoadData[0]。TotalDistance.ToString(),TimeLow=FileLoadData[0]。TimeLow.ToString(),
TimeMed=FileLoadData[0]。TimeMed.ToString(),TimeHigh=FileLoadData[0]。TimeHigh.ToString(),TimeSprint=FileLoadData[0]。TimeSprint.ToString(),DistSprint=“null”},
新选项卡ItemContent{Vince=FileLoadData[1]。Vince,TopSpeed=FileLoadData[1]。TopSpeed.ToString(),Distriun=FileLoadData[1]。TotalDistance.ToString(),TimeLow=FileLoadData[1]。TimeLow.ToString(),
TimeMed=FileLoadData[1]。TimeMed.ToString(),TimeHigh=FileLoadData[1]。TimeHigh.ToString(),TimeSprint=FileLoadData[1]。TimeSprint.ToString(),DistSprint=“null”};
//此处出错,应添加到选项卡项
tbcIndividualStats.ItemsSource=选项卡项内容;
}
我一直在寻找一个解决办法,但我无法找到一个工作。我只需要将FileLoadData[0]和FileLoadData[1]中的数据分别绑定到两个选项卡项。

从XAML中删除这些
元素:

<TabItem Header="PlayerName" Background="Transparent" />
<TabItem Header="PlayerName2" Background="Transparent" />


您不能既将单个项目添加到
选项卡控件
,又使用
项目资源
。这是一种或另一种方式。

我会采取不同的策略:

将要在选项卡项的标题中显示的名称添加到模型中:

public class TabItemContent
{
    public string PlayerName {get; set;}  // New Property for the Tabitem Header
    public string Venue { get; set; }
    public string TopSpeed { get; set; }
    public string DistRun { get; set; }
    public string TimeLow { get; set; }
    public string TimeMed { get; set; }
    public string TimeHigh { get; set; }
    public string TimeSprint { get; set; }
    public string DistSprint { get; set; }
}
然后,考虑到这个新属性,我将更改Xaml:

<TabControl Name="tbcIndividualStats" HorizontalAlignment="Left" Height="652" VerticalAlignment="Top" Width="1338">
  <!--Template for all tabs (idea is to have them dynamically created eventually)-->
  <!--Content template-->
  <TabControl.ContentTemplate>
    <DataTemplate>
      <Grid>
        <!--Border just holds the stuff-->
        <Border BorderBrush="#FF53535B" BorderThickness="3" HorizontalAlignment="Left" Height="452" VerticalAlignment="Top" Width="520" Margin="10,135,0,0">
          <StackPanel Margin="0,0,-1,0">
            <TextBlock Name="txtVenue" Margin="10,7" FontSize="30" Foreground="White" Text="{Binding Venue}" />
            <TextBlock Name="txtTopSpeed" Margin="10,7" FontSize="30" Foreground="White" Text="{Binding TopSpeed}" />
            <TextBlock Name="txtDistRun" Margin="10,7" FontSize="30" Foreground="White" Text="{Binding DistRun}" />
            <TextBlock Name="txtTimeLow" Margin="10,7" FontSize="30" Foreground="White" Text="{Binding TimeLow}" />
            <TextBlock Name="txtTimeMed" Margin="10,7" FontSize="30" Foreground="White" Text="{Binding TimeMed}" />
            <TextBlock Name="txtTimeHigh" Margin="10,7" FontSize="30" Foreground="White" Text="{Binding TimeHigh}" />
            <TextBlock Name="txtTimeSprint" Margin="10,7" FontSize="30" Foreground="White" Text="{Binding TimeSprint}" />
            <TextBlock Name="txtSprintDist" Margin="10,7" FontSize="30" Foreground="White" Text="{Binding SprintDist}" />
          </StackPanel>
        </Border>
      </Grid>
    </DataTemplate>
  </TabControl.ContentTemplate>

  <!--Item Template-->
  <TabControl.ItemTemplate>
    <DataTemplate>
        <Border>
            <Textblock = Text="{Binding PlayerName}"/>
        </Border>
    </DataTemplate>
  </TabControl.ItemTemplate>
</TabControl>

编辑:项目模板是tabitem按钮的模板,内容模板是其内容的模板。这里有一些参考资料:

我还删除了TabControl中定义的两个TabItem


还记得设置ItemsSource->如果您在code behind中设置它,删除这一行:
ItemsSource=“{Binding tabcontrolitems}”

您不能在tabcontrol中同时设置itemsource和添加xaml中的tabitem。只需设置ItemSource,即可从XAML中删除元素。你不能既在XAML中添加项目,又使用项目资源。ContentTemplate和ItemTemplate是一样的吗?@Babbillumpa是的,tbh不确定两者的区别,我看到的所有示例看起来几乎相同,你能解释一下区别吗?(我是wpf的新手)@MattWilson检查答案,我试图给你一个建议。啊,谢谢你,它停止了错误,但问题是它似乎没有显示文本块中的数据,我查看了可视化树,所有对象都在那里,但没有为任何标签设置文本属性(但所有数据都正确地显示在列表中).现在我已经删除了这两个选项卡项,如何准确地将它们添加回去,以便可以在标题之间切换?请不要在“评论”字段中询问其他问题。一旦您的原始问题得到解决,如果您有其他问题,您应该问另一个问题。这样做了!非常感谢!标记为“答案”。同时,在我“我仍然把你带到这里,你能给我一个简短的解释一下ItemTemplate和ContentTemplate之间的区别吗?”马特·威尔逊我编辑了答案,并提供了一些参考。
public class TabItemContent
{
    public string PlayerName {get; set;}  // New Property for the Tabitem Header
    public string Venue { get; set; }
    public string TopSpeed { get; set; }
    public string DistRun { get; set; }
    public string TimeLow { get; set; }
    public string TimeMed { get; set; }
    public string TimeHigh { get; set; }
    public string TimeSprint { get; set; }
    public string DistSprint { get; set; }
}
<TabControl Name="tbcIndividualStats" HorizontalAlignment="Left" Height="652" VerticalAlignment="Top" Width="1338">
  <!--Template for all tabs (idea is to have them dynamically created eventually)-->
  <!--Content template-->
  <TabControl.ContentTemplate>
    <DataTemplate>
      <Grid>
        <!--Border just holds the stuff-->
        <Border BorderBrush="#FF53535B" BorderThickness="3" HorizontalAlignment="Left" Height="452" VerticalAlignment="Top" Width="520" Margin="10,135,0,0">
          <StackPanel Margin="0,0,-1,0">
            <TextBlock Name="txtVenue" Margin="10,7" FontSize="30" Foreground="White" Text="{Binding Venue}" />
            <TextBlock Name="txtTopSpeed" Margin="10,7" FontSize="30" Foreground="White" Text="{Binding TopSpeed}" />
            <TextBlock Name="txtDistRun" Margin="10,7" FontSize="30" Foreground="White" Text="{Binding DistRun}" />
            <TextBlock Name="txtTimeLow" Margin="10,7" FontSize="30" Foreground="White" Text="{Binding TimeLow}" />
            <TextBlock Name="txtTimeMed" Margin="10,7" FontSize="30" Foreground="White" Text="{Binding TimeMed}" />
            <TextBlock Name="txtTimeHigh" Margin="10,7" FontSize="30" Foreground="White" Text="{Binding TimeHigh}" />
            <TextBlock Name="txtTimeSprint" Margin="10,7" FontSize="30" Foreground="White" Text="{Binding TimeSprint}" />
            <TextBlock Name="txtSprintDist" Margin="10,7" FontSize="30" Foreground="White" Text="{Binding SprintDist}" />
          </StackPanel>
        </Border>
      </Grid>
    </DataTemplate>
  </TabControl.ContentTemplate>

  <!--Item Template-->
  <TabControl.ItemTemplate>
    <DataTemplate>
        <Border>
            <Textblock = Text="{Binding PlayerName}"/>
        </Border>
    </DataTemplate>
  </TabControl.ItemTemplate>
</TabControl>