Фильтрация в Silverlight с помощью служб RIA

У меня есть небольшое приложение SL, которое использует службы RIA для отображения данных о сотрудниках (база данных Northwind) в сетке данных. У меня есть текстовый фильтр, который отлично работает с столбцами varchar, но не фильтрует столбец int, допускающий значение NULL. Вот xaml:

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

Любая помощь будет оценена по достоинству. Спасибо


person Mohit Nigam    schedule 02.12.2009    source источник
comment
Можете ли вы исправить свой xaml выше? Какой фильтр имеет значение int, допускающее значение NULL? Свойство TestFilter? Вероятно, просто невозможно смешивать и сопоставлять типы в операторе Or.   -  person Bryant    schedule 03.12.2009


Ответы (2)


Я думаю, что вам нужен ValueConverter, который преобразует текст TestFilter в int, прежде чем он будет передан в LINQ.

person Don Rule    schedule 21.01.2010

У вас должна быть возможность без проблем смешивать и сопоставлять типы в фильтрах. Вам также не нужен преобразователь значений для преобразования из строки в int, FilterDescriptor автоматически проанализирует значение.

Тем не менее, XAML, который вы показываете, не показывает никаких полей типа int. Какой оператор вы пытаетесь использовать для фильтра? Это должен быть числовой оператор, например IsEqualTo, IsGreaterThan и т. Д.

Какой результат? Он загружается без данных, не загружается или игнорирует фильтр?

Вы можете попробовать обработать событие LoadingData и посмотреть на EntityQuery, отображаемый в аргументах события, чтобы увидеть, что было создано для запроса.

person Jeff Handley    schedule 03.02.2010