2010-01-29 55 views
0

我正在使用RIA Services构建Silverlight应用程序。我想实现主/细节行为。这里的诀窍是“细节”网格不能直接用主网格的“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而不是代码隐藏。

谢谢!

回答

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> 

和绑定你的ItemsSource dataForm1为会员 'DomainDataSourceRaceTrackGetUserById' 的 '数据'。测试它,让我知道如果我失去了一些东西。

希望这会有所帮助!

+0

我得到一个错误:当AutLoad设置为True和CanLoad设置为False QueryParameters不能改变。有任何想法吗?另外,在第一次加载时,我得到错误加载操作失败,查询'GetUserFromId'。序列不包含任何元素。 有什么建议吗? – brafales 2010-02-01 10:40:23

+0

我认为你在我们的PDC版本中遇到了一些限制,造成了一些令人头痛的问题。当一个现有的负载正在等待时,我们正在阻止负载,并且这种情况非常频繁。 该行为将在我们的下一个版本中得到解决,以便在调用新的加载时,挂起的加载将被取消。 与此同时,您可能必须关闭子数据DomainDataSource的自动加载,侦听主网格上的SelectionChange事件,取消子数据上的任何挂起的加载并调用新的加载。 – 2010-02-03 07:47:27

+0

好的,我会试试看。 感谢这两个答案! – brafales 2010-02-03 21:25:30

1

这里是完整的XAML。它执行得非常快,所以请让我知道它是否可以做得更好。 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 2010-02-02 14:39:59