WPF ObjectDataProviderメソッドパラメーターは、ComboBox選択された値にバインドします

StackOverflow https://stackoverflow.com/questions/5363938

質問

WPFバインディングの問題に対処しています。 2つの可能な値でフィルターされたデータグリッドを提示するユーザーコントロールを作成しています。最初の値はテキストボックスによって設定され、2番目の値はコンボボックスによって設定されます。 ObjectDataproviderを使用して2つのパラメーターをMethosにマッピングしています。TextboxとComboboxは、これら2つのパラメーターを設定する必要があります。これがコードです。

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

どうしたの? TextBoxプロパティをバインドするだけではすべて正常に機能しますが、combobox.seletedValueプロパティを最初のメソッドパラメーターにバインドしようとすると、例外がスローされます(WPFエンジンによって静かに処理されます):

System.Windows.Dataエラー:35:objectDataprovider:タイプでメソッドを呼び出そうとする障害。 method = 'getCorse'; type = 'Horsedataprovider';エラー= '一致するパラメーター署名では方法は見つかりませんでした。 MissingMethoDexception: 'System.MissingMethodexception:Method' VisualHorse.Horsedataprovider.getCorse 'は見つかりません。 System.runtimeType.invokemember(文字列名、バインディングフラグバインディングフラグ、バインダーバインダー、オブジェクトターゲット、オブジェクト、オブジェクト[] redargs、parametermodifier [] system.windows.data.objethonintancidant(例外) ) '

どんな助けも感謝します

役に立ちましたか?

解決

わかりました、私は私のアプローチで問題を見つけました。単純に、ComboBox.SelectedValueタイプがComboBoxのどのように入力するかに依存しているとはわかりませんでした(コードで行ったのは)。 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メソッドパラメーターにバインドされています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top