Pregunta

Estoy lidiando con un problema en la vinculación de WPF. Estoy creando un control de usuario que presente una datagrid, fielizada por 2 valores posibles. El primer valor se establece mediante un cuadro de texto, el segundo por un cuadro combinado. Estoy usando un ObjectDataProvider para mapear un methos con 2 parámetros, y el cuadro de texto y el comboBox deben establecer estos 2 parámetros. Aquí está el código.

<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é tiene de malo? Todo funciona bien si solo encuentro la propiedad del cuadro de texto, pero tratando de unir la propiedad ComboBox.SeletedValue al primer parámetro de método, lanza una excepción (manejada silenciosamente por el motor WPF):

System.Windows.data Error: 35: ObjectDataProvider: falla intentando invocar el método en el tipo; Método = 'getCorse'; Type = 'Horsedataprovider'; Error = 'No se encontró ningún método con la firma de parámetros coincidentes'. MissingMethodException: 'System.MissingMethodException: Method' VisualHorse.HorsedAprovider.getCorse 'no encontrado. en System.RuntimeType.InvokEmember (nombre de cadena, Bindeflags BindingFlags, aglutinante de aglutinante, objetivo de objeto, objeto [] SidedArgs, Parametermodifier [] modificadores, cultura de cultivoinfo, cadena [] de párpado) en system.windows.data.ObjectDataprovider.invokemetodoninstance (excepción y E EXCECCIÓN Y E ) '

Cualquier ayuda sería apreciada

¿Fue útil?

Solución

Ok, encontré el problema en mi enfoque. Simplemente, no obtuve que el tipo de Value de Combobox.Selected depende de cómo pueblo el Combobox (que lo hice en el código detrás). Simplemente modificando la definición de ObjectDataProvider de la siguiente manera, resolvió el problema:

<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 esta manera, el ComboBox.SelectedItem está vinculado a un parámetro de método INT32.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top