2009-12-02 9 views
0

J'ai une petite application SL qui utilise les services RIA pour afficher les données des employés (base de données Northwind) dans une grille de données. J'ai un filtre de texte, qui fonctionne bien contre les colonnes varchar mais ne filtre pas sur une colonne int nullable. Voici le XAML:Filtrage dans Silverlight avec les services RIA

<UserControl xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Ria" 
     xmlns:riaData="clr-namespace:System.Windows.Data;assembly=System.Windows.Controls.Ria" 
     xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="FilteringSample.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:web="clr-namespace:FilteringSample.Web" 
xmlns:converter="clr-namespace:FilteringSample" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"> 
<UserControl.Resources> 
    <converter:StringToIntConverter x:Key="MyConverter"></converter:StringToIntConverter> 
</UserControl.Resources> 
    <Grid x:Name="LayoutRoot"> 
<StackPanel Orientation="Vertical" Height="Auto" Grid.Column="0"> 
     <StackPanel Orientation="Horizontal"> 
      <Button x:Name="saveButton" Width="75" Height="30" Content="Save" Margin="5" Click="saveButton_Click"/> 
      <Button x:Name="rejectButton" Width="75" Height="30" Content="Reject" Margin="5" Click="rejectButton_Click"/> 
      <TextBlock x:Name="changeText" VerticalAlignment="Center" Width="Auto"/> 
      <TextBox x:Name="Filter" Width="100" Text="" /> 
      <riaControls:DomainDataSource x:Name="DataSource1" QueryName="GetEmployeesQuery" LoadingData="DataSource1_LoadingData" > 
       <riaControls:DomainDataSource.DomainContext> 
        <!--<web:CustomerContext></web:CustomerContext>--> 
        <web:EmployeeContext></web:EmployeeContext> 
       </riaControls:DomainDataSource.DomainContext> 

       <riaControls:DomainDataSource.FilterDescriptors> 
        <riaData:FilterDescriptorCollection LogicalOperator="Or">             
         <riaData:FilterDescriptor PropertyPath="FirstName" Operator="Contains"> 
          <riaControls:ControlParameter ControlName="Filter" PropertyName="Text" RefreshEventName="TextChanged" /> 
         </riaData:FilterDescriptor> 
         <riaData:FilterDescriptor PropertyPath="Title" Operator="Contains"> 
          <riaControls:ControlParameter ControlName="Filter" PropertyName="Text" RefreshEventName="TextChanged" /> 
         </riaData:FilterDescriptor> 
         <riaData:FilterDescriptor PropertyPath="TestFilter" Operator="Contains"> 
          <riaControls:ControlParameter ControlName="Filter" PropertyName="Text" RefreshEventName="TextChanged"/> 
         </riaData:FilterDescriptor> 

        </riaData:FilterDescriptorCollection> 
       </riaControls:DomainDataSource.FilterDescriptors> 
      </riaControls:DomainDataSource> 

     </StackPanel> 
     <data:DataGrid Name="MyGrid" ItemsSource="{Binding Data, ElementName=DataSource1}"> 
     </data:DataGrid> 
     <!--<data:DataPager PageSize="20" Source="{Binding Data, ElementName=DataSource1}" Margin="0,-1,0,0" />--> 
    </StackPanel> 

Toute aide sera appréciée. Merci

+0

Pouvez-vous réparer votre xaml ci-dessus? Quel filtre est l'intensible NULL? La propriété TestFilter? Probablement juste ne peut pas mélanger et faire correspondre les types dans l'instruction Or. – Bryant

Répondre

1

Je pense que vous avez besoin d'un ValueConverter qui convertit le texte de TestFilter en int avant qu'il ne soit transmis à LINQ.

1

Vous devriez être en mesure de mélanger et assortir les types dans les filtres sans aucun problème. Vous n'avez pas non plus besoin d'un convertisseur de valeur pour convertir une chaîne en un int, le FilterDescriptor analysera automatiquement la valeur.

Le XAML que vous montrez ne montre cependant pas de champs int. Quel opérateur essayez-vous d'utiliser pour le filtre? Cela devrait être un opérateur numérique comme IsEqualTo, IsGreaterThan, etc.

Quel est le résultat? Est-ce qu'il charge sans données, ne parvient pas à charger, ou ignore le filtre?

Vous voudrez peut-être essayer de gérer l'événement LoadingData et regarder l'EntityQuery exposé sur l'argument args pour voir ce qui a été composé pour la requête.

Questions connexes