paramètre de méthode WPF ObjectDataProvider se lient à la valeur sélectionnée de la liste déroulante

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

Question

Je suis face à un problème dans WPF contraignant. Je crée un contrôle utilisateur qui présente une grille de données, fiiltered par 2 valeurs possibles. La première valeur est définie par une zone de texte, la seconde par une zone de liste. J'utilise un ObjectDataProvider pour mapper un methos avec 2 paramètres, et la zone de texte et le combobox devrait définir ces 2 paramètres. Voici le code.

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

Qu'est-ce qui ne va pas avec elle? Tout fonctionne bien si je viens de lier la propriété zone de texte, mais en essayant de lier la propriété Combobox.SeletedValue à la première méthode paramètre, il lance une exception (traitée en silence par le moteur WPF):

System.Windows.Data Erreur: 35: ObjectDataProvider: Echec de invoquer procédé du type; Méthode = 'GetCorse'; Type = 'HorseDataProvider'; Erreur = 'Non méthode a été trouvé avec la mise en correspondance signature paramètre. MissingMethodException: 'System.MissingMethodException: Méthode 'VisualHorse.HorseDataProvider.GetCorse' pas trouvé. à System.RuntimeType.InvokeMember (String nom, BindingFlags BindingFlags, liant liant, cible de l'objet, l'objet [] providedArgs, ParameterModifier [] des modificateurs, culture CultureInfo, String [] namedParams) à System.Windows.Data.ObjectDataProvider.InvokeMethodOnInstance (Exception & e) '

Toute aide serait appréciée

Était-ce utile?

La solution

Ok, je trouve la question de mon approche. Simplement, je n'ai pas que le type de ComboBox.SelectedValue dépend de la façon dont je alimenter le combobox (Wich je l'ai fait dans le code derrière). modifiant simplement la définition ObjectDataProvider de la manière suivante, résolu le problème:

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

De cette façon, le ComboBox.SelectedItem est lié à un paramètre de méthode Int32.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top