piątek, 21 grudnia 2012

ObjectDataProvider - filtrowanie danych

W poście omawiającym bindowanie do różnych źródeł danych omawiałem ObjectDataProvider.
Tym razem bardziej praktyczny przykład. Scenariusz jest taki:
Na formatce jest ListBox oraz dwa TextBox-y do wprowadzania imienia i nazwiska. Baza danych przechowuje klientów. Formatka ma za zadanie wyświetlać wszystkich klientów jeżeli nie wprowadzono wartości filtrów do TextBox-ów, bądź też przefiltrować dane jeżeli filtry zostały wprowadzone przez użytkownika.

Rozwiązanie:
Tworzymy ObjectDataProvider wraz z definicją dwóch parametrów.
TextBox-y bindujemy z parametrami przekazywanymi do ObjectDataProvide.

Kod:

Code:
<Window x:Class="Binidng_ObjectDataProvider.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:binidngObjectDataProvider="clr-namespace:Binidng_ObjectDataProvider"
        xmlns:system="clr-namespace:System;assembly=mscorlib" Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ObjectDataProvider x:Key="odpCustomers" ObjectType="{x:Type binidngObjectDataProvider:DataService}" MethodName="GetCustomersByFirstName" >
            <ObjectDataProvider.MethodParameters>
                <x:Static Member="system:String.Empty" />
                <x:Static Member="system:String.Empty" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <ListBox ItemsSource="{Binding Source={StaticResource odpCustomers}}" 
                 DisplayMemberPath="FirstName"></ListBox>
        
        <Grid Grid.Column="1" Margin="5">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="70" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <TextBlock VerticalAlignment="Center">Imię:</TextBlock>
            <TextBox Width="100" Grid.Column="1" HorizontalAlignment="Left">
                <TextBox.Text>
                    <Binding Source="{StaticResource odpCustomers}"
                             Path="MethodParameters[0]"
                             BindsDirectlyToSource="true"
                             UpdateSourceTrigger="LostFocus" />
                </TextBox.Text>
            </TextBox>

            <TextBlock VerticalAlignment="Center" Grid.Row="1">Nazwisko:</TextBlock>
            <TextBox Width="100" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left">
                <TextBox.Text>
                    <Binding Source="{StaticResource odpCustomers}"
                             Path="MethodParameters[1]"
                             BindsDirectlyToSource="true"
                             UpdateSourceTrigger="LostFocus" />
                </TextBox.Text>
            </TextBox>
        </Grid>
    </Grid>
</Window>

Najważniejsze w całym przedsięwzięciu są definicje bindowania dla TextBox. W nich specyfikujemy, który parametr ObjectDataProvider będzie związany zawartością w polu tekstowym.

Nasz serwis z metodą odpowiedzialną za zwracanie rekordów z bazy danych wygląda następująco:

Code:
using System.Collections.Generic;
using System.Linq;

namespace Binidng_ObjectDataProvider
{
    public class DataService
    {
        private readonly AdventureWorksLTEntities context = new AdventureWorksLTEntities();

        public DataService()
        {
            
        }

    public IList<Customer> GetCustomersByFirstName(string startLetter, string lastName)
        {
            var result = context.Customer.AsQueryable();
            if (!string.IsNullOrWhiteSpace(startLetter))
            {
                result = result.Where(x => x.FirstName.StartsWith(startLetter));
            }
            if (!string.IsNullOrWhiteSpace(lastName))
            {
                result = result.Where(x => x.LastName.StartsWith(startLetter));
            }

            return result.ToList();
        }
    }
}

Efekt:



Cały kod do pobrania z linku: http://sdrv.ms/UY8jdJ

Brak komentarzy:

Prześlij komentarz