【问题标题】:wpf ObjectDataProvider method parameter bind to combobox selected valuewpf ObjectDataProvider 方法参数绑定到组合框选定值
【发布时间】:2011-03-19 18:21:56
【问题描述】:

我正在处理 WPF 绑定中的一个问题。 我正在创建一个用户控件,它呈现一个数据网格,由 2 个可能的值过滤。 第一个值由文本框设置,第二个值由组合框设置。 我正在使用 ObjectDataProvider 来映射具有 2 个参数的方法,并且文本框和组合框应该设置这 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>

它有什么问题? 如果我只绑定文本框属性,一切正常,但尝试将 Combobox.SeletedValue 属性绑定到第一个方法参数会引发异常(由 wpf 引擎静默处理):

System.Windows.Data 错误:35: ObjectDataProvider:尝试失败 在类型上调用方法; 方法='GetCorse'; 类型='HorseDataProvider';错误='否 找到匹配的方法 参数签名。 MissingMethodException:'System.MissingMethodException: 方法 'VisualHorse.HorseDataProvider.GetCorse' 未找到。在 System.RuntimeType.InvokeMember(字符串 名称,BindingFlags bindingFlags, 活页夹活页夹,对象目标,对象[] 提供的参数,参数修饰符[] 修饰符,CultureInfo 文化, 字符串 [] 命名参数)在 System.Windows.Data.ObjectDataProvider.InvokeMethodOnInstance(异常& e)'

任何帮助将不胜感激

【问题讨论】:

  • 如果使用MVVM会容易得多。
  • 我是 WPF 的新手,在深入研究 MVVM 模式之前,我想通过直接的方法了解和试验 XAML 功能。也就是说,我想知道它不起作用的原因是否是 XAML 和 WPF 引擎的限制问题,或者更容易是我的方法的错误。
  • 好的,但如果要说一下我的经验,我从来没有使用过 ObjectDataProvider,因为在模型中使用集合比在视图中使用对我来说更好。

标签: wpf combobox wpfdatagrid objectdataprovider


【解决方案1】:

好的,我在我的方法中发现了问题。 简单地说,我没有得到 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 方法参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多