WPF ObjectDataprovider -Methode Parameter BIND an Combobox -ausgewählte Wert
-
27-10-2019 - |
Frage
Ich habe es mit einem Problem bei der WPF -Bindung zu tun. Ich erstelle eine Benutzerkontrolle, die ein Datagrid darstellt, das von 2 möglichen Werten festgelegt wird. Der erste Wert wird durch ein Textfeld festgelegt, das zweite nach einem Kombinationsfeld. Ich verwende einen ObjectDataprovider, um ein Methos mit 2 Parametern zuzuordnen, und das Textfeld und das Combobox sollten diese 2 Parameter festlegen. Hier ist der 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>
Was stimmt damit nicht? Alles funktioniert gut, wenn ich nur die Textbox -Eigenschaft binden, aber der Versuch, das Combobox zu binden.
System.Windows.Data ERROR: 35: ObjectDataprovider: Fehler versucht, die Methode auf Typ aufzurufen; Method = 'getCorse'; Type = 'horsedataprovider'; Fehler = 'Es wurde keine Methode mit der Übereinstimmungsparametersignatur gefunden.' Fehlende Methodexception: 'System.missingMethodException: Methode' visualhorse.horsedataprovider.getCorse 'nicht gefunden. at system.runtimetype.invokemember (String -Name, BindingFlags BindingFlags, Binderbinder, Objektziel, Objekt [] bereitgestelltesArgs, Parametermodifier [] Modifikatoren, CultureInfo -Kultur, String [] namensparams) at system.windows.data.objectdataprovider.invokeTheTance (AUCTECTICEDATEDATEDATEDATEDATE.Invider.Invish ) '
Jede Hilfe wäre geschätzt
Lösung
Ok, ich fand das Problem in meinem Ansatz. Ich habe einfach nicht das Combobox verstanden. SelectedValue -Typ hängt davon ab, wie ich den Combobox bevölkern (mit dem ich im Code dahinter gemacht habe). Einfach die ObjectDataprovider -Definition nach folgenden Weise ändern und das Problem behoben:
<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>
Auf diese Weise ist der Combobox.SelectedItem an einen Int32 -Methodeparameter gebunden.