C# 使用文本框筛选绑定到xml的listview

C# 使用文本框筛选绑定到xml的listview,c#,wpf,C#,Wpf,在这里输入代码嘿,伙计们, 我是wpf编程新手,当用户在文本框中键入时,我很难过滤列表视图。当我试图过滤所有我得到的是一个黑色的列表视图。。。我相信这是由于“我是过滤器”的部分是节点的属性,我不确定如何使用该属性进行过滤 <Item quantity="0" baseRef="2" desc="BLANK Item, "> <Material selected="0" ref="2" color="" /> <Material

在这里输入代码
嘿,伙计们, 我是wpf编程新手,当用户在文本框中键入时,我很难过滤列表视图。当我试图过滤所有我得到的是一个黑色的列表视图。。。我相信这是由于“我是过滤器”的部分是节点的属性,我不确定如何使用该属性进行过滤

    <Item quantity="0" baseRef="2" desc="BLANK Item, ">
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
    </Item>
    <Item quantity="0" baseRef="2" desc="BLANK Item, ">
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
    </Item>
范例 我正在尝试使用项的baseRef进行筛选

    <Item quantity="0" baseRef="2" desc="BLANK Item, ">
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
    </Item>
    <Item quantity="0" baseRef="2" desc="BLANK Item, ">
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
    </Item>
提前谢谢

    <Item quantity="0" baseRef="2" desc="BLANK Item, ">
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
    </Item>
    <Item quantity="0" baseRef="2" desc="BLANK Item, ">
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
    </Item>
这是我的密码

    private bool FilterItem(object obj)
    {
        Item item = obj as Item;
        if (item == null) return false;

        string textFilter = Filtertxt.Text;

        if (textFilter.Trim().Length == 0) return true; // the filter is empty - pass all items

        // apply the filter
        if (item.ItemNum.ToLower().Contains(textFilter.ToLower())) return true;
        return false;
    }

    private void Filtertxt_TextChanged(object sender, TextChangedEventArgs e)

    {
        if (!this.IsInitialized) return;    // get out of here if the window is not initialized


        /// Get the default view from the listview
        ICollectionView view = CollectionViewSource.GetDefaultView(lviewItemsList.ItemsSource  );

        view.Filter = null;
        view.Filter = new Predicate<object>(FilterItem);
    }
My Xml struct 
    <Item quantity="0" baseRef="2" desc="BLANK Item, ">
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
    </Item>
    <Item quantity="0" baseRef="2" desc="BLANK Item, ">
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
    </Item>
私有布尔过滤器项(对象对象对象)
{
项目=作为项目的obj;
如果(item==null)返回false;
字符串textFilter=filterText.Text;
如果(textFilter.Trim().Length==0)返回true;//筛选器为空-传递所有项
//应用过滤器
if(item.ItemNum.ToLower().Contains(textFilter.ToLower())返回true;
返回false;
}
私有无效过滤器text_TextChanged(对象发送方,textchangedventargs e)
{
if(!this.IsInitialized)return;//如果窗口未初始化,请离开这里
///从listview获取默认视图
ICollectionView视图=CollectionViewSource.GetDefaultView(lviewItemsList.ItemsSource);
view.Filter=null;
view.Filter=新谓词(FilterItem);
}
我的Xml结构

    <Item quantity="0" baseRef="2" desc="BLANK Item, ">
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
    </Item>
    <Item quantity="0" baseRef="2" desc="BLANK Item, ">
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
    </Item>

    <Item quantity="0" baseRef="2" desc="BLANK Item, ">
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
    </Item>
    <Item quantity="0" baseRef="2" desc="BLANK Item, ">
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
    </Item>
Xml在xaml中使用xpath进行解析

    <Item quantity="0" baseRef="2" desc="BLANK Item, ">
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
    </Item>
    <Item quantity="0" baseRef="2" desc="BLANK Item, ">
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
    </Item>
<ListView Name="lviewItemsList" 
           MouseDoubleClick="DataGrid_MouseDoubleClick"
              ItemsSource="{Binding Source={StaticResource plData}, XPath=/PickList/Items/Item}" 
              IsSynchronizedWithCurrentItem="True" Margin="87,32,63.9999999999991,61"
      KeyboardNavigation.TabNavigation="Continue" Grid.Row="1"  >
        <ListView.View>
            <GridView x:Name="Itemlist" ColumnHeaderContainerStyle="{StaticResource GridHeaderStyle}">
                <GridViewColumn  Header="Item" DisplayMemberBinding="{Binding XPath=@baseRef}"/>
                <GridViewColumn  Header ="Qty" CellTemplate="{StaticResource Qty}"/>
                <GridViewColumn Header="Finish" CellTemplate="{StaticResource ItemFin}" Width="0"/>
                <GridViewColumn Header="Description" DisplayMemberBinding="{Binding XPath=@desc}"/>
            </GridView>
        </ListView.View>
    </ListView>

enter code here

在这里输入代码
ItemNum是一个item类。。我试图作为一个物体通过。。我在这里真的迷路了

    <Item quantity="0" baseRef="2" desc="BLANK Item, ">
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
    </Item>
    <Item quantity="0" baseRef="2" desc="BLANK Item, ">
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
    </Item>
internal class Item : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void FirePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    private string itemNum = "";
    public string ItemNum
    {
        get { return itemNum; }
        set { itemNum = value; FirePropertyChanged("ItemNum"); }
    }
    private string itemDesc = "";
    public string ItemDesc 
    {
        get { return itemDesc; }
        set { itemDesc = value; FirePropertyChanged("ItemDesc "); }
    }

    internal class ItemCollection : ObservableCollection<Item>
    {
    }
}
内部类项:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
受保护的无效FirePropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
私有字符串itemNum=“”;
公共字符串ItemNum
{
获取{return itemNum;}
设置{itemNum=value;FirePropertyChanged(“itemNum”);}
}
私有字符串itemDesc=“”;
公共字符串ItemDesc
{
获取{return itemDesc;}
设置{itemDesc=value;FirePropertyChanged(“itemDesc”);}
}
内部类ItemCollection:ObservableCollection
{
}
}

}

您似乎直接绑定到一个
XmlDocument
,该文档包含一个名为
Item
的元素,然后尝试将其过滤,就像您定义的一个名为
Item
的类一样。这是不对的,您的
FilterItem()
接收的对象只是一个
XmlElement
。框架应该如何确定您想要将其转换为某个恰好具有相同名称的类?(如果它设法找到了您想要的,它如何进行转换?

如何解析XML?什么是
ItemNum
?我使用xpath解析xml,ItemNum用于Item类。。我忘了加上那个密码剪。。但是现在它就在那里。。我真的迷路了,伙计们-(您是否尝试过在
FilterItem()中设置断点
?顺便说一句,我不知道你可以在XAML中使用XML数据。感谢你让我了解这一点。我仍然愿意接受建议。我真的不知道还有什么可以尝试。非常好的一点,我很抱歉你不得不研究…我只是真的不知道如何使用attr。我从来没有在wpf中编码过…所以这对我来说都是新的。。这个我能得到的是项目元素…我会继续研究。。。
    <Item quantity="0" baseRef="2" desc="BLANK Item, ">
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
    </Item>
    <Item quantity="0" baseRef="2" desc="BLANK Item, ">
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
        <Material selected="0" ref="2" color="" />
    </Item>