Silverlight Databind для параметризованного DataService - PullRequest
0 голосов
/ 29 января 2010

Я создаю приложение Silverlight с использованием RIA Services. Я хочу реализовать мастер / детали поведения. Хитрость в том, что сетка «детали» не может быть заполнена напрямую с помощью свойства «SelectedItem» главной сетки, и мне нужно получить одно из полей из главной сетки и использовать его в качестве параметра для DataService. Как будет привязка?

Это код параметризованного запроса:

public Usuarios GetUserFromId(int id)
    {
        return this.ObjectContext.Usuarios.Where(u => u.ID == id).First();
    }

А вот источники на XAML:

<riaControls:DomainDataSource x:Name="DomainDataSourceRaceTrackGetUsersWithRole" AutoLoad="True" QueryName="GetUsersWithRoleQuery" LoadSize="20">
            <riaControls:DomainDataSource.DomainContext>
            <App:DomainServiceRaceTrack></App:DomainServiceRaceTrack>
        </riaControls:DomainDataSource.DomainContext>
        </riaControls:DomainDataSource>
    <riaControls:DomainDataSource x:Name="DomainDataSourceRaceTrackGetUserById" AutoLoad="True" QueryName="GetUserFromId">
        <riaControls:DomainDataSource.DomainContext>
            <App:DomainServiceRaceTrack></App:DomainServiceRaceTrack>
        </riaControls:DomainDataSource.DomainContext>
    </riaControls:DomainDataSource>

Вот как я связываю мастер-сетку:

<data:DataGrid x:Name="DataGridUsers" AutoGenerateColumns="False" ItemsSource="{Binding Data, ElementName=DomainDataSourceRaceTrackGetUsersWithRole}">

А затем в SelectedItemChanged мне нужно заполнить сетку деталей, но привязка, которую я использую, не работает:

<dataControls:DataForm x:Name="dataForm1" Height="393" Width="331"
                           VerticalAlignment="Top"       
                           Header="User Details"
                           CurrentItem="{Binding DataGridUsers.SelectedItem.Id, ElementName=DomainDataSourceRaceTrackGetUserById}" 
                            HorizontalAlignment="Left" >
                <dataControls:DataForm.EditTemplate>

Кто-нибудь знает, что я делаю не так? Я хотел бы использовать XAML вместо codebehind.

Спасибо!

Ответы [ 2 ]

1 голос
/ 01 февраля 2010

Вот полный XAML. Это реализовано очень быстро, поэтому, пожалуйста, дайте мне знать, если это можно сделать еще лучше. Нажмите здесь для получения полного исходного кода проекта

 <UserControl xmlns:my1="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm.Toolkit"  x:Class="Silverlight4LobHol.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="600" d:DesignWidth="800" xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" xmlns:controlsToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit" xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Ria" xmlns:my="clr-namespace:Silverlight4LobHol.Web" xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" xmlns:my2="clr-namespace:System.Windows.Data;assembly=System.Windows.Controls.Ria" xmlns:dataInput="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input">

    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="300" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="50" />
            <RowDefinition Height="*" />
            <RowDefinition Height="50" />
        </Grid.RowDefinitions>
        <riaControls:DomainDataSource AutoLoad="True" LoadedData="orderDomainDataSource_LoadedData" Name="orderDomainDataSource" QueryName="GetOrdersQuery">
                <riaControls:DomainDataSource.DomainContext>
                <my:NorthWindDomainContext />
            </riaControls:DomainDataSource.DomainContext>
        </riaControls:DomainDataSource>
        <data:DataGrid AutoGenerateColumns="False" Grid.Row="1" Grid.Column="0" ItemsSource="{Binding ElementName=orderDomainDataSource, Path=Data}" Name="orderDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected">
            <data:DataGrid.Columns>
                <data:DataGridTextColumn x:Name="customerIdColumn" Binding="{Binding Path=CustomerID}" Header="CustomerID" Width="SizeToHeader"  />
                <data:DataGridTextColumn x:Name="freightColumn" Binding="{Binding Path=Freight}" Header="Freight" Width="SizeToHeader" />
                <data:DataGridTemplateColumn x:Name="orderDateColumn" Header="Order Date" Width="SizeToHeader">
                    <data:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <controls:DatePicker SelectedDate="{Binding Path=OrderDate, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" />
                        </DataTemplate>
                    </data:DataGridTemplateColumn.CellTemplate>
                </data:DataGridTemplateColumn>
                <data:DataGridTextColumn x:Name="orderIDColumn" Binding="{Binding Path=OrderID}" Header="Order ID" Width="SizeToHeader" />
                <data:DataGridTemplateColumn x:Name="requiredDateColumn" Header="Required Date" Width="SizeToHeader">
                    <data:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <controls:DatePicker SelectedDate="{Binding Path=RequiredDate, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" />
                        </DataTemplate>
                    </data:DataGridTemplateColumn.CellTemplate>
                </data:DataGridTemplateColumn>
                <data:DataGridTextColumn x:Name="shipAddressColumn" Binding="{Binding Path=ShipAddress}" Header="Ship Address" Width="SizeToHeader" />
                <data:DataGridTextColumn x:Name="shipCityColumn" Binding="{Binding Path=ShipCity}" Header="Ship City" Width="SizeToHeader" />
                <data:DataGridTextColumn x:Name="shipCountryColumn" Binding="{Binding Path=ShipCountry}" Header="Ship Country" Width="SizeToHeader" />
                <data:DataGridTextColumn x:Name="shipNameColumn" Binding="{Binding Path=ShipName}" Header="Ship Name" Width="SizeToHeader" />
                <data:DataGridTemplateColumn x:Name="shippedDateColumn" Header="Shipped Date" Width="SizeToHeader">
                    <data:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <controls:DatePicker SelectedDate="{Binding Path=ShippedDate, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" />
                        </DataTemplate>
                    </data:DataGridTemplateColumn.CellTemplate>
                </data:DataGridTemplateColumn>
                <data:DataGridTextColumn x:Name="shipPostalCodeColumn" Binding="{Binding Path=ShipPostalCode}" Header="Ship Postal Code" Width="SizeToHeader" />
                <data:DataGridTextColumn x:Name="shipRegionColumn" Binding="{Binding Path=ShipRegion}" Header="Ship Region" Width="SizeToHeader" />
                <data:DataGridTextColumn x:Name="shipViaColumn" Binding="{Binding Path=ShipVia}" Header="Ship Via" Width="SizeToHeader" />
            </data:DataGrid.Columns>
        </data:DataGrid>
        <controlsToolkit:BusyIndicator Grid.Row="1" Grid.Column="0" IsBusy="{Binding ElementName=orderDomainDataSource,Path=IsBusy}"></controlsToolkit:BusyIndicator>
        <riaControls:DomainDataSource AutoLoad="True" Height="0" LoadedData="customerDomainDataSource_LoadedData" Name="customerDomainDataSource" QueryName="GetCustomersByCustomerIdQuery" Width="0" Visibility="Visible">
            <riaControls:DomainDataSource.DomainContext>
                <my:NorthWindDomainContext />
            </riaControls:DomainDataSource.DomainContext>
            <riaControls:DomainDataSource.QueryParameters>
                <riaControls:ControlParameter ControlName="orderDataGrid" ParameterName="customerId" PropertyName="SelectedItem.CustomerID" RefreshEventName="SelectionChanged" />
            </riaControls:DomainDataSource.QueryParameters>
        </riaControls:DomainDataSource>
                <my1:DataForm Grid.Row="1" Grid.Column="1"  ItemsSource="{Binding ElementName=customerDomainDataSource, Path=Data}" HeaderVisibility="Collapsed"></my1:DataForm> 

    </Grid>
</UserControl>
1 голос
/ 30 января 2010

Хорошо! Вы должны передать параметр 'id' в 'DomainDataSourceRaceTrackGetUserById', без которого службы RIA не имеют представления, где получить значение 'id'.

<riaControls:DomainDataSource x:Name="DomainDataSourceRaceTrackGetUserById" AutoLoad="True" QueryName="GetUserFromId">
        <riaControls:DomainDataSource.DomainContext>
            <App:DomainServiceRaceTrack></App:DomainServiceRaceTrack>
        </riaControls:DomainDataSource.DomainContext>

<riaControls:DomainDataSource.QueryParameters> <riaData:ControlParameter
                    ParameterName="id"
                    ControlName="DataGridUsers"
                    PropertyName="SelectedItem.Id"
                    RefreshEventName="SelectedItemChanged" /> </riaControls:DomainDataSource.QueryParameters>
    </riaControls:DomainDataSource>

и привяжите ваш DataForm1 ItemsSource к члену 'Data' объекта 'DomainDataSourceRaceTrackGetUserById'. Проверьте это и дайте мне знать, если я что-то упустил.

Надеюсь, это поможет!

...