親ビューに表示したい親ViewModelにObservableCollectionがあります。そこで、ボタンのクリックを処理する子 View と子 ViewModel を定義しました。ボタンクリック処理のために既に設定されている RelayCommands を失うことなく、ObservableCollection から対応する子 ViewModel に各項目を取得するにはどうすればよいですか?
親の View Code-Behind では、DataContext を適切な ViewModel に設定するだけです。
DataContext = new ParentViewModel();
親のビュー XAML で、子ビューの DataTemplate を表示するために ListBox を定義しました。
<ListBox
ItemsSource="{Binding Path=Items}">
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type vm:ChildViewModel}">
<views:ChildView Width="auto" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
ここで、ChildView で、ObservableCollection 内で指定されたパスでファイルを実行するバインディング データとボタンを表示するいくつかの TextBlocks を取得しました。
<TextBlock
Text="{Binding Path=Title}" />
...
<Button
Content="Start exe"
Tag="{Binding Path=ExePath}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding Path=OnButtonClicked}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
子 ViewModel は、ボタン クリック イベントを処理するための RelayCommands を保持します。
private RelayCommand onButtonClicked;
public ICommand OnButtonClicked
{
get
{
return onButtonClicked ??
(onButtonClicked =
new RelayCommand(ObeyOnButtonClicked, CanObeyOnButtonClicked));
}
}
private void ObeyOnButtonClicked()
{
... //Path conversion
Process.Start(pathToExe);
}
private bool CanObeyOnButtonClicked()
{
return true;
}
ここで、子ビューのコード ビハインド内に追加すると、
DataContext = new SampleItemViewModel();
コンストラクターに対して、ボタンのクリックは処理されますが、TextBoxes はすべて空です。この行を削除すると、TextBox は正しく入力されますが、ボタンのクリックは処理されません。
両方の機能を動作させるにはどうすればよいですか?
編集:
親ビューモデル:
private ObservableCollection<Item> items;
public ObservableCollection<Item> Items
{
get { return items; }
set
{
items= value;
OnPropertyChanged("Items");
}
}
... //Filling the Collection in Constructor
ChildViewModel には、上記のボタン クリック ハンドラーのみが含まれます。
編集:
いくつかのことを試しましたが、ChildView の DataContext を ChildViewModel に設定せずに、ChildView から ChildViewModel に Command をバインドする方法がわかりません