2011-03-19 108 views
0

我正在处理WPF绑定中的问题。 我正在创建一个用户控件,它提供了一个datagrid,由2个可能的值过滤。 第一个值由文本框设置,第二个由组合框设置。 我正在使用ObjectDataProvider来映射带有2个参数的方法,并且文本框和组合框应该设置这2个参数。 这是代码。wpf ObjectDataProvider方法参数绑定到组合框选定的值

<UserControl x:Class="VisualHorse.Corse" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:VisualHorse" 
     xmlns:system="clr-namespace:System;assembly=mscorlib" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="530" Loaded="UserControl_Loaded"> 
<UserControl.Resources> 
    <ObjectDataProvider x:Key="HorseDataProvider" 
      ObjectType="{x:Type local:HorseDataProvider}" 
      MethodName="GetCorse" > 
     <ObjectDataProvider.MethodParameters> 
      <x:Static Member="system:String.Empty" /> 
      <x:Static Member="system:String.Empty" /> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
</UserControl.Resources> 
<StackPanel > 
    <Grid Name="GRIDFilter" Height="50"> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <Label Content="Data corsa" HorizontalAlignment="Center" Name="label1" VerticalAlignment="Center" /> 
     <Label Content="Località" Grid.Column="1" HorizontalAlignment="Center" Name="label2" VerticalAlignment="Center" /> 
     <Label Content="N° Corsa" Grid.Column="2" HorizontalAlignment="Center" Name="label3" VerticalAlignment="Center" /> 
     <Button Content="Filtra" Grid.Column="3" Grid.RowSpan="2" Width="50" Height="30" /> 
     <DatePicker Grid.Row="1" HorizontalAlignment="Center" Name="DPDataCorsa" VerticalAlignment="Center" Width="115" /> 
     <ComboBox Grid.Column="1" Grid.Row="1" HorizontalAlignment="Stretch" Name="CBlocalita" VerticalAlignment="Center" Margin="5,0" > 
      <ComboBox.SelectedValue> 
       <Binding Source="{StaticResource HorseDataProvider}" 
       Path="MethodParameters[0]" 
       BindsDirectlyToSource="true"/> 
      </ComboBox.SelectedValue> 
     </ComboBox> 
     <TextBox Name="TBNumCorsa" Grid.Column="2" Grid.Row="1" Margin="5,0" > 
      <Binding Source="{StaticResource HorseDataProvider}" 
       Path="MethodParameters[1]" 
       BindsDirectlyToSource="true" 
       UpdateSourceTrigger="PropertyChanged" /> 
     </TextBox> 
    </Grid> 

    <DataGrid Name="DGCorse" ItemsSource="{Binding Source={StaticResource HorseDataProvider}}" AutoGenerateColumns="False" Margin="0,10,0,0" CanUserResizeRows="False" SelectionMode="Single"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Path=Localita.descrizione}" Header="Località" /> 
      <DataGridTextColumn Binding="{Binding Path=data, StringFormat=\{0:d\}}" Header="Data Corsa" /> 
      <DataGridTextColumn Binding="{Binding Path=numero}" Header="N° Corsa" /> 
      <DataGridTextColumn Binding="{Binding Path=TipoCorsa.descrizione}" Header="Tipo corsa" /> 
      <DataGridTextColumn Binding="{Binding Path=TipoTerreno.descrizione}" Header="Terreno" /> 
      <DataGridTextColumn Binding="{Binding Path=TipoFantino.descrizione}" Header="Tipo fantino" /> 
      <DataGridTextColumn Binding="{Binding Path=premio, StringFormat=\{0:c\}}" Header="Premio" /> 
      <DataGridTextColumn Binding="{Binding Path=distacchi}" Header="Distacchi" /> 
      <DataGridTextColumn Binding="{Binding Path=distanza}" Header="Distanza" /> 
      <DataGridTextColumn Binding="{Binding Path=TipoPista.descrizione}" Header="Pista" /> 
      <DataGridTextColumn Binding="{Binding Path=Eta.descrizione}" Header="Età" /> 
     </DataGrid.Columns> 
    </DataGrid> 
</StackPanel> 

这有什么错呢? 一切工作正常,如果我只是绑定文本框属性,但试图将Combobox.SeletedValue属性绑定到它抛出一个异常(由WPF引擎时自动处理)的第一个方法参数:

System.Windows.Data Error: 35 : ObjectDataProvider: Failure trying to invoke method on type; Method='GetCorse'; Type='HorseDataProvider'; Error='No method was found with matching parameter signature.' MissingMethodException:'System.MissingMethodException: Method 'VisualHorse.HorseDataProvider.GetCorse' not found. at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) at System.Windows.Data.ObjectDataProvider.InvokeMethodOnInstance(Exception& e)'

任何帮助将是赞赏

+0

如果使用MVVM会容易得多。 – vorrtex 2011-03-19 18:25:40

+1

我是WPF的新手,我想直接理解并试验XAML特性,然后再深入到MVVM模式。这就是说,我想知道它不起作用的原因是XAML和WPF引擎的限制问题,还是更容易在我的方法中出现错误。 – themarcuz 2011-03-20 16:32:06

+0

好的,但如果说我的经验,我从来没有使用过ObjectDataProvider,因为它对模型中的集合比视图中的集合更好。 – vorrtex 2011-03-20 17:38:16

回答

0

好的,我发现我的方法问题。 简单地说,我没有得到ComboBox.SelectedValue类型取决于我如何填充组合框(这是我在代码后面)。 仅仅修改下列方式的ObjectDataProvider定义,解决了这个问题:

<ObjectDataProvider x:Key="HorseDataProvider" 
      ObjectType="{x:Type local:HorseDataProvider}" 
      MethodName="GetCorse" > 
     <ObjectDataProvider.MethodParameters>     
      <system:Int32>0</system:Int32> 
      <x:Static Member="system:String.Empty" />     
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 

这种方式,ComboBox.SelectedItem被绑定到一个Int32方法参数。