WPF:自定义集合(List <type>)数据绑定到具有路径过滤的列表框

时间:2017-03-04 20:37:44

标签: c# wpf listbox dataprovider

我创建了一个自定义DataSourceProvider,它提供List<XmlNode>作为查询结果。

通过使用Path参数,生成的Listbox应包含在XmlNode中指定的属性的指定列表

Path = Tag应使用List中包含的Tag填充列表框。但相反,它会使用第一个List-items标记填充列表。

问题是为什么Path参数不会从List中检索所有Tag元素,而只会从第一个列表元素Tag中删除字母。

自定义列表作为资源提供:

<Window.Resources>

    <classes:Custom_XmlProvider x:Key="txtProvider" Path="name" />

</Window.Resources>

ListBox使用Path = Tag绑定到资源:

 <ListBox Grid.Row="1" ItemsSource="{Binding Path=Tag, Source={ StaticResource txtProvider}}"
             DockPanel.Dock="Bottom">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Label Content="{Binding}" FontFamily="Arial" FontWeight="Normal" Margin="5,0,0,0"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

自定义DataSourceProvider返回包含1200个对象的List:

protected override void BeginQuery()
    {
        System.Threading.ThreadPool.QueueUserWorkItem(RunQuery, null);
    }

    private void RunQuery(object state)
    {
        base.BeginQuery();

        try
        {
            //TODO - do something with the NodeList
            c_pData = c_thisXmlParser.NodeList;

            OnQueryFinished(c_pData, null, null, c_pData);
        }
        catch
        {
            OnQueryFinished(null, null, null, null);
        }
    }

XmlNode定义为:

 public class XmlNode
{
    public string Tag { get; set; }
    public string Type { get; set; }
    public string InnerText { get; set; }
    public int FileNumber { get; set; }
    public int NodeDepth { get; set; }
    public int IndexNumber { get; set; }
}

这是列表中的第一个元素:

First List-Item

,结果列表在窗口中显示如下:

enter image description here

上面的列表应该包含Tag元素列表,我无法正确理解为什么Path参数不收集List的正确元素,而是提供第一个list-elements标记名称的列表

1 个答案:

答案 0 :(得分:1)

您通常绑定到ItemsSource的属性是包含一些元素集合的属性。绑定属性Tag是字符串,字符串恰好是字符集合。这就是每个列表项包含foodlist的单个字符的原因,WPF非常乐意将此绑定解释为FirstOrDefault。你的绑定有什么问题是Path应该是空的。然后在您的标签中,它是空的,应该是Tag

<ListBox Grid.Row="1" ItemsSource="{Binding, Source={ StaticResource txtProvider}}"
             DockPanel.Dock="Bottom">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Label Content="{Binding Path=Tag}" FontFamily="Arial" FontWeight="Normal" Margin="5,0,0,0"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
相关问题