C#とxamlを使い、MVVMパターンのプログラムを作っています。
フレームワークは.NET Core3.0。
MVVMインフラストラクチャとしてLivetを使っています。
プログラムは正常に動いていました。MainWindow.xamlのコードが長くなったため、userControlを使い、そのxamlを2つに分割しました。するとデバッグ中、あるボタンを押したときにエラーが表示されるようになり困っています。
以下にソースを載せます。
MainWindow.xaml
xaml
1...(略) 2 <Window.DataContext> 3 <vm:MainWindowViewModel /> 4 </Window.DataContext> 5...(略) 6 <WrapPanel Grid.Row="4" 7 Grid.Column="1" 8 Width="100" 9 HorizontalAlignment="Left" 10 x:Name="WorkPalette"> 11 <v:MainWindowSetWork/>
MainWindowSetWork
xaml
1<UserControl 2...(略) 3 <Grid> 4 <WrapPanel> 5 <Button Content="A" Width="50"> 6 <behaviors:Interaction.Triggers> 7 <behaviors:EventTrigger EventName="Click"> 8 <l:LivetCallMethodAction 9 MethodName="SetWork0" 10 MethodTarget="{Binding}" 11 MethodParameter="{Binding ElementName=hopeTable, 12 Path=(DataGrid.SelectedCells)}"/> 13 </behaviors:EventTrigger> 14 </behaviors:Interaction.Triggers> 15 </Button>
MainWindowViewModel.cs
c#
1...(略) 2 public void SetWork0(IEnumerable<DataGridCellInfo> selectedCells) 3 { 4 SetWorks(selectedCells, WorkNameEnum.A, SelectedNumberOfWork); 5 } 6...(略)
SetWork0をバインドしたボタンを押すと、
本来はMethodParameterに、DataGrid上で選択されたセルの情報が入ります。
それがSetWork0()メソッドの第1引数となり、このメソッドが実行されます。
しかし、xamlを2つに分割して以降は、以下のエラーが表示されます。
「ハンドルされていない例外」 System.ArgumentException: 'MainWindowViewModel 型に 引数を持たないメソッド SetWork0 が見つかりません。'
どうやら、MethodParameterに値が入らず、SetWork0()メソッドの第1引数に
値が入っていない模様。つまり、MethodParameterに値を代入するBinding部分が
失敗しているのだろうと、推測しています。
実は、追加で質問があります。
そもそも、このxamlを2つに分割したのは、UserControlの
MethodParameterに関し、RelativeSourceを使って値を代入したかったためです。下記コードではうまくいかず、上記と同じエラーが出ました。何がおかしいか教えていただければ幸いです。
MainWindowSetWork
xaml
1<UserControl 2...(略) 3 <Grid> 4 <WrapPanel> 5 <Button Content="A" Width="50"> 6 <behaviors:Interaction.Triggers> 7 <behaviors:EventTrigger EventName="Click"> 8 <l:LivetCallMethodAction 9 MethodName="SetWork0" 10 MethodTarget="{Binding}" 11 MethodParameter="{Binding SelectedCells, 12 RelativeSource={RelativeSource 13 AncestorType={x:Type DataGrid}}}"/> 14 </behaviors:EventTrigger> 15 </behaviors:Interaction.Triggers> 16 </Button>
(追記)
DataGridはMainWindow.xaml側に存在します。
そしてUserControlであるMainWindowSetWork.xamlはDataGridの「外部」にいます。
そのためDataGRidとUserControlは兄弟関係です。
回答1件
あなたの回答
tips
プレビュー