2017-03-04 2 views
0

クエリ結果としてList<XmlNode>を提供するカスタムDataSourceProviderを作成しました。WPF:カスタムコレクション(リスト<Type>)リストボックスへのパスフィルタリングによるデータバインディング

は、Pathパラメータを使用することにより、結果のリストボックスは、リストに含まれているタグ(複数可)をリストボックスに移入する必要があり

パス=タグのXmlNodeに指定されたプロパティの指定されたリストが含まれている必要があります。しかし代わりに、リストに最初のList-Itemsタグが設定されます。

質問はです。なぜなら、PathパラメータはListのすべてのTag要素を取得せず、最初のリスト要素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:

<Window.Resources> 

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

</Window.Resources> 

のListBoxがパス=タグが付けられたリソースに結合する:



カスタムリストは、リソースとして提供されています1200オブジェクトのリスト:

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

上記l istにTag要素のリストが含まれている必要があります.PathパラメータがListの適切な要素を収集しない理由を正しく理解できず、最初のlist-elementsタグ名のリストを提供します。

答えて

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

私はそれを愛しています。知らないことの非効率性は、単純さ自体で解決されます。唯一の問題は、あなたが愚かであるという感情を得ることです:)ありがとう。 –

+0

私を混乱させたのは、元のコードがXmlNode要素のリストを与えた 'Path =。 'でバインドされていたということでした。 –

関連する問題