C# 如何根据xml文件中的数据数量在列表框中加载datatemplate

C# 如何根据xml文件中的数据数量在列表框中加载datatemplate,c#,xml,wpf,C#,Xml,Wpf,我在xml文件中有一个任务列表,我希望它将它绑定到标签上,在每个模板的每个标签上一个接一个,我无法按照xml文件中任务的数量加载模板。任务的数量应该等于模板的数量,标签应该包含任务的名称,我被困在这里是数据模板的代码 <Window.Resources> <DataTemplate x:Key="tasktemplate1"> <Canvas Height="50" Width="850">

我在xml文件中有一个任务列表,我希望它将它绑定到标签上,在每个模板的每个标签上一个接一个,我无法按照xml文件中任务的数量加载模板。任务的数量应该等于模板的数量,标签应该包含任务的名称,我被困在这里是数据模板的代码

 <Window.Resources>
            <DataTemplate x:Key="tasktemplate1">
                <Canvas Height="50" Width="850">
                    <Label   Height="30" Width="170" Canvas.Top="10" Canvas.Left="130" Background="LightGray">
                    </Label>
                    <TextBox Height="30" Width="120" Canvas.Top="10" Canvas.Left="370" Background="LightBlue"></TextBox>
                    <Label Canvas.Left="500" Canvas.Top="10">$</Label>
                    <Button Click="deletebuttonclick" Canvas.Top="12" Height="10" Width="30" Canvas.Left="600" ></Button>
                </Canvas>
            </DataTemplate>
        </Window.Resources>

$
对于listbox,代码如下所示

 <TabItem>
        <Canvas Height="700" Width="850">

            <ListBox ItemTemplate="{StaticResource tasktemplate1}" ItemsSource="{Binding NameList}"  x:Name="listBox" Height="700" Width="850">
            </ListBox>
            <Label Canvas.Top="-18" Canvas.Left="185">Select Task</Label>
            <Label Canvas.Top="-18" Canvas.Left="377" RenderTransformOrigin="0.58,0.462">Enter Bill Rates</Label>
            <Button Canvas.Left="39" Canvas.Top="575" Width="139">Click to add the task</Button>
        </Canvas>
    </TabItem>

选择任务
输入票据费率
单击以添加任务
目前,我正在将其绑定到我手动创建的名称列表。后面的代码取决于此代码,创建了4个数据模板,但我无法从模板标签上的xml文件中获取任务

 private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        XmlDocument doc1 = new XmlDocument();
        doc1.Load("http://store.tymesheet.com/templates/Software-Developer.xml");
        XmlElement root = doc1.DocumentElement;
        XmlNodeList nodes = root.SelectNodes("Tasks/task");
        string temp=null;
        foreach(XmlNode node in nodes)
        {
            temp = node["name"].InnerText;
        }

        _nameList = new List<string>
                    {
                      "1",
                      "2",
                      "3",
                      "4",
                    };
        DataContext = this;
    }

    private List<string> _nameList;
    public List<string> NameList
    {
        get { return _nameList; }
    }
private void Window\u已加载(对象发送方,路由目标)
{
XmlDocument doc1=新的XmlDocument();
doc1.加载(“http://store.tymesheet.com/templates/Software-Developer.xml");
XmlElement root=doc1.DocumentElement;
XmlNodeList nodes=root.SelectNodes(“任务/任务”);
字符串temp=null;
foreach(节点中的XmlNode节点)
{
temp=节点[“名称”]。InnerText;
}
_名称列表=新列表
{
"1",
"2",
"3",
"4",
};
DataContext=this;
}
私人名单(姓名名单),;
公开名单
{
获取{return\u nameList;}
}
xml文件的屏幕截图如下所示

这里是我的模板外观的屏幕截图


如果您需要获取任务的
名称
,您可以直接在XAML中使用
XmlDataProvider
,它将充当列表框的
项目资源

<Canvas Height="700" Width="850">
    <Canvas.Resources>
        <XmlDataProvider x:Key="Tasks" XPath="tasks"
           Source="http://store.tymesheet.com/templates/Software-Developer.xml"/>
        <DataTemplate x:Key="tasktemplate1">
            <Canvas Height="50" Width="850" Background="lightgray">
                <Label Content="{Binding XPath=name}" Height="30"
                       Width="170" Canvas.Top="10" Canvas.Left="150" 
                       Background="LightGray"/>
                <TextBox Height="30" Width="60" Canvas.Top="10"
                         Canvas.Left="370" Background="Black"/>
                <Label Canvas.Left="500" Canvas.Top="10">$</Label>
                <Button Click="deletebuttonclick" 
                        Canvas.Top="12" Height="10" Width="30"
                        Canvas.Left="600"/> 
            </Canvas>
        </DataTemplate>
    </Canvas.Resources>
    <ListBox ItemTemplate="{StaticResource tasktemplate1}"
          ItemsSource="{Binding Path=ChildNodes, Source={StaticResource Tasks}}" 
          x:Name="listBox" Height="700" Width="850"/>
    ....
</Canvas>
在XAML中:

将标签内容绑定到绑定,如下所示:

<Canvas Height="700" Width="850">
    <Canvas.Resources>
        <DataTemplate x:Key="tasktemplate1">
            <Canvas Height="50" Width="850" Background="lightgray">
                <Label Content="{Binding}"      <-- HERE
                       Height="30" Width="170"
                       Canvas.Top="10" Canvas.Left="150"
                       Background="LightGray"/>
                <TextBox Height="30" Width="60" Canvas.Top="10"
                         Canvas.Left="370" 
                         Background="Black"/>
                <Label Canvas.Left="500" Canvas.Top="10">$</Label>
                <Button Click="deletebuttonclick" Canvas.Top="12" Height="10" 
                        Width="30" Canvas.Left="600"/>
            </Canvas>
        </DataTemplate>
    </Canvas.Resources>
    <ListBox ItemTemplate="{StaticResource tasktemplate1}"
                x:Name="listBox" Height="700" Width="850"/>
    ....
</Canvas>


than wat关于创建的模板数量?它是否与xml文件中的任务数量完全相同?是的,因为我已绑定到ChildNodes集合,所以它将等于集合中的任务数量。在您提供的XML中,这将显示11个任务。我也使用代码隐藏方法进行了更新。看看这是否有帮助。创建一个列表并从该列表中删除项,然后分配回listBox的ItemsSource。或者,如果使用
ObservableCollection
使用正确的绑定,只需从列表中删除项即可更新UI。(从列表中删除要从UI中删除的项目)。请帮助我回答我发布的问题
<Canvas Height="700" Width="850">
    <Canvas.Resources>
        <DataTemplate x:Key="tasktemplate1">
            <Canvas Height="50" Width="850" Background="lightgray">
                <Label Content="{Binding}"      <-- HERE
                       Height="30" Width="170"
                       Canvas.Top="10" Canvas.Left="150"
                       Background="LightGray"/>
                <TextBox Height="30" Width="60" Canvas.Top="10"
                         Canvas.Left="370" 
                         Background="Black"/>
                <Label Canvas.Left="500" Canvas.Top="10">$</Label>
                <Button Click="deletebuttonclick" Canvas.Top="12" Height="10" 
                        Width="30" Canvas.Left="600"/>
            </Canvas>
        </DataTemplate>
    </Canvas.Resources>
    <ListBox ItemTemplate="{StaticResource tasktemplate1}"
                x:Name="listBox" Height="700" Width="850"/>
    ....
</Canvas>