2009-12-02 102 views
0

我有一个使用RIA服务在数据网格中显示员工数据(Northwind数据库)的小型SL应用程序。我有一个文本过滤器,对varchar列工作正常,但不过滤可空int列。这里是XAML:使用RIA服务在Silverlight中筛选

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

任何帮助将不胜感激。 谢谢

+0

你可以修复上面的xaml吗?哪些筛选器是可空的int? TestFilter属性?可能只是不能在Or语句中混合和匹配类型。 – Bryant 2009-12-02 23:59:00

回答

1

我认为你需要一个ValueConverter在将TestFilter的文本传递给LINQ之前将其转换为int。

1

您应该可以在过滤器中混合匹配类型,而不会出现任何问题。您也不需要将值从字符串转换为int的值转换器,FilterDescriptor将自动分析值。

您显示的XAML不显示任何int字段。你想用什么操作符来过滤?它必须是一个数字运算符,如IsEqualTo,IsGreaterThan等。

结果是什么?它是否加载没有数据,加载失败或忽略过滤器?

您可能想要尝试处理LoadingData事件并查看事件参数上公开的EntityQuery以查看查询的内容。