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