2010-01-29 4 views
0

Я создаю приложение Silverlight, используя службы RIA. Я хочу реализовать поведение мастера/детали. Фокус в том, что сетка «детализация» не может быть заполнена непосредственно свойством «SelectedItem» главной сетки, и мне нужно сделать одно из полей из главной сетки и использовать ее как параметр для DataService. Как будет привязка?Silverlight Databind к параметризованной 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 мне нужно заполнить сетку Detail, но привязка, которую я использую, не работает:

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

Спасибо!

ответ

1

Хорошо! Вы должны передать параметр «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 члену 'Данные' из 'DomainDataSourceRaceTrackGetUserById'. Испытайте это и сообщите мне, если я что-то упустил.

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

+0

Я получаю сообщение об ошибке: QueryParameters не может быть изменен, когда AutLoad устанавливается Истина и CanLoad установлен в значение False. Есть идеи? Кроме того, при первом загрузке я получаю ошибку «Ошибка загрузки» для запроса «GetUserFromId». Последовательность не содержит элементов. Любые идеи? – brafales

+0

Я думаю, что вы нарушаете ограничения в нашем выпуске PDC, что вызвало некоторые головные боли для людей. Мы блокировали нагрузки, когда существующая нагрузка находилась на рассмотрении, и это получалось очень часто. Это поведение будет исправлено в следующем выпуске, так что ожидающая загрузка будет отменена при вызове новой загрузки. В то же время вам может потребоваться отключить автоматическую загрузку для дочерних данных DomainDataSource, прослушать события SelectionChange в главной сетке, отменить любые ожидающие загрузки дочерних данных и вызвать новую нагрузку. –

+0

Хорошо, я попробую. Спасибо за ответы! – brafales

1

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

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

Удалось ли решить эту проблему? или все еще у вас есть некоторые проблемы? – funwithcoding

Смежные вопросы