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

时间:2014-06-17 11:24:46

标签: c# xml wpf

我在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>
列表框代码的

就像这样

 <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; }
    }

xml文件的屏幕截图是 enter image description here

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

enter image description here

1 个答案:

答案 0 :(得分:1)

如果您需要获得 name 任务,则只能使用 XmlDataProvider 直接在XAML中执行此操作您的ListBox> ItemsSource

<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>

将路径设置为 ChildNodes ,并将标签绑定 XPath 设置为 name


<强>更新

如果你想在后面的代码中执行它,你必须填写列表并将ItemsSource设置为该列表。 (确保添加名称空间 System.Linq 以使用Select,OfType等扩展方法。)

XmlDocument doc = new XmlDocument();
doc.Load("http://store.tymesheet.com/templates/Software-Developer.xml");
var taskList = doc.ChildNodes.OfType<XmlNode>()
               .Where(node => node.Name == "tasks")
               .SelectMany(node => node.ChildNodes.OfType<XmlNode>())
               .Select(node => node["name"].InnerText);
listBox.ItemsSource = taskList;

XAML

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

<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>