2009-12-16 2 views
0

기본적으로 목록 상자에서 사용자에게 공지 사항을 표시하는 WPF 응용 프로그램이 있습니다. 목록 상자를 채우는 정보는 여러 공지 사항에 대한 세부 정보가 들어있는 XML 파일에서 가져옵니다. 그런 다음 데이터 템플릿을 적용하여 관련 정보를 표시합니다. 내가 가지고있는 것은 응용 프로그램의 하단에있는 두 개의 단추입니다. 사용자가 읽지 않은 공지 단추를 클릭하면 데이터가 필터링되어 목록 상자에 읽지 않은 공지 사항 만 표시됩니다. 그런 다음 사용자가 모든 공지 사항을 클릭하면 모두 표시됩니다. 사용중인 데이터 템플릿은 클릭 한 것과 동일하게 유지됩니다.WPF에서 바인딩 된 XML 데이터 필터링

사용되는 XML 파일에는 read라는 필드가 있습니다. 0은 읽지 않았 음을 나타내며 1은 가지고있는 것을 나타내며이 필드는 필터링에 사용해야합니다.

그래서 저는 실제로 필터링이나 좋은 자습서의 예제를 찾고 있습니다. 그래서 나는 약간의 진전을 이룰 수 있습니다. 당신이 내 코드의 필요한 경우 단지 저에게 알려 주시면에 붙여 넣을 수 있습니다 아래

편집

이제 추가 코드는 데이터 바인딩하는 방법을 보여주고 또한 데이터의 레이아웃 :.

XML 파일에 유지 된 데이터의
<XmlDataProvider 
         x:Key="Article" 
         Source="/Data/People.xml" 
         XPath="People/article"/> 
<DataTemplate x:Key="AnnouncementTemplate"> 
      <Border Background="#2200FF00" 
          BorderBrush="Black" 
          BorderThickness="1" 
          CornerRadius="8" 
          Margin="2,4,2,4" 
          Padding="2" 
        > 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="30"/> 
         <ColumnDefinition Width="220"/> 
        </Grid.ColumnDefinitions> 
        <Border Background="#2200FF00" 
          BorderBrush="Black" 
          BorderThickness="1" 
          CornerRadius="8" 
          Margin="2,4,2,4" 
          Padding="2" 
        > 
        <StackPanel Grid.Column="0"> 
         <Image Stretch="Fill" Width="20" Source="Images/BlueOrb.ico" Height="20" VerticalAlignment="Center" HorizontalAlignment="Center"/> 
        </StackPanel> 
       </Border> 
       <StackPanel Grid.Column="1" Margin="5"> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock FontWeight="Bold" Text="{Binding XPath=./author}" /> 
         <TextBlock Text=" "/> 
         <TextBlock Text="{Binding XPath=./datetime}" TextTrimming="WordEllipsis"/> 
        </StackPanel> 
        <StackPanel> 
         <TextBlock FontWeight="Bold" Text="{Binding XPath=./title}"/> 
        </StackPanel> 
        <StackPanel> 
         <TextBlock Text="{Binding XPath=./body}" TextTrimming="WordEllipsis"/> 
        </StackPanel> 
       </StackPanel> 

       </Grid> 
      </Border> 
     </DataTemplate> 

<ListBox Style="{StaticResource SpecialListStyle}" 
         Name="listBox1" 
         Margin="10,10,10,10" 
         Grid.Row="1" 
         ItemsSource="{Binding Source={StaticResource Article}}" 
         IsSynchronizedWithCurrentItem="True" 
         ItemContainerStyle="{StaticResource SpecialListItem}" 
         ItemTemplate="{StaticResource AnnouncementTemplate}"/> 

실시 예는, 데이터는 단지 메시지를 표시 할 수 있도록 여과하고 싶은 곳 판독 == 0

<People> 
    <article> 
    <author>Michael</author> 
    <title>Happy Christmas</title> 
    <body>Merry Christmas one and all</body> 
    <priority>1</priority> 
    <uid>G-0617-8567-EF32-hello</uid> 
    <audience>0</audience> 
    <read>0</read> 
    <datetime>December 31, 2009 23:59:59</datetime> 
    </article> 
    <article> 
    <author>Gary</author> 
    <title>Landesk</title> 
    <body>Landesk Distributed</body> 
    <priority>0</priority> 
    <uid>G-0618-8567-EF32-hello</uid> 
    <audience>0</audience> 
    <read>1</read> 
    <datetime>December 31, 2009 23:59:59</datetime> 
    </article> 
</People> 
+2

절반 지식 그래서 항상 유해를하시기 바랍니다 더 나은 입력을위한 몇 가지 코드를 붙여 넣으십시오. – Firoz

+0

매우 사실이 게시되었습니다. 연휴로 인해 늦어서 죄송합니다. – manemawanna

답변

0
지금 또한 문서 요소의 속성으로 XML 파일의 읽기 노드를 만들기 관련이 사용하여 다음 코드를 해결 할 수있었습니다

:

ICollectionView RefineList() 
    { 
     DataSourceProvider provider = (DataSourceProvider)this.FindResource("Article"); 
     return CollectionViewSource.GetDefaultView(provider.Data); 
    } 

     private void Unread_Click(object sender, RoutedEventArgs e) 
    { 
     ICollectionView view = RefineList(); 
     if (view.Filter == null) 
     { 
      view.Filter = delegate(object item) 
      { 
       return 
       int.Parse(((XmlElement)item).Attributes["read"].Value) == 0; 
      }; 
     } 
     else 
     { 
      view.Filter = null; 
     } 
    } 
1

데이터를 목록 상자 나 유사한 컨트롤에 바인딩하면 WPF는 CollectionViewSource 인스턴스로 래핑합니다.

데이터 소스의 이름이 myItems 인 경우를 가정 해 보겠습니다. 그런 다음 다음과 같이이 인스턴스를 얻을 수 있습니다 :

ICollectionViewSource viewSource = CollectionViewSource.GetDefaultView(myItems); 

ICollectionViewSource 당신이 항목을 필터링하는 데 사용할 수있는 Filter 속성이 있습니다. ICollectionViewSource.Refresh()를 사용하여 내용을 새로 고치도록 시각적 컨트롤을 강제로 적용 할 수도 있습니다.

관련 문제