WPF 바인딩의 문제를 처리하고 있습니다. 2 개의 가능한 값으로 필터링 된 DataGrid를 제공하는 사용자 정의 컨트롤을 만들고 있습니다. 첫 번째 값은 텍스트 상자에 의해 설정되고 두 번째 값은 콤보 상자에 의해 설정됩니다. ObjectDataProvider를 사용하여 2 개의 매개 변수로 메토를 매핑하고 텍스트 상자와 콤보 상자에서이 두 매개 변수를 설정해야합니다. 다음은 코드입니다.wpf ObjectDataProvider 메서드 매개 변수가 콤보 상자의 선택된 값으로 바인딩됩니다.
<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>
그 문제점은 무엇입니까?
System.Windows.Data Error: 35 : ObjectDataProvider: Failure trying to invoke method on type; Method='GetCorse'; Type='HorseDataProvider'; Error='No method was found with matching parameter signature.' MissingMethodException:'System.MissingMethodException: Method 'VisualHorse.HorseDataProvider.GetCorse' not found. at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) at System.Windows.Data.ObjectDataProvider.InvokeMethodOnInstance(Exception& e)'
상관 도움이 될 것이다 : 난 그냥 텍스트 상자의 속성을 결합하지만 (자동 WPF 엔진에 의해 처리) 예외를 throw 첫 번째 방법 매개 변수로 Combobox.SeletedValue 속성을 결합하려고하면 모든 것이 잘 작동 apprecicated
MVVM을 사용하는 것이 훨씬 쉬울 것입니다. – vorrtex
WPF를 처음 사용 했으므로 MVVM 패턴으로 들어가기 전에 직접 접근 방식으로 XAML 기능을 이해하고 실험하고 싶습니다. 그렇다면 작동하지 않는 이유는 XAML 및 WPF 엔진의 제한 사항이거나 내 접근 방식의 오류 일 수 있습니다. – themarcuz
좋아,하지만 내 경험에 대해 말한다면,보기보다는 모델에서 컬렉션을 사용하는 것이 나을 수 있기 때문에 결코 ObjectDataProvider를 사용하지 않았습니다. – vorrtex