2

親ビューに表示したい親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 をバインドする方法がわかりません

4

1 に答える 1

1

Button には Command プロパティがあるため、Event Trigger を削除できます。

<TextBlock Text="{Binding Path=Title}" />
...
<Button
  Content="Start exe"
  Tag="{Binding Path=ExePath}"
  Command="{Binding Path=OnButtonClicked}"
>
</Button>

そして DataContext を設定します:

<ListBox
  ItemsSource="{Binding Path=Items}">
  <ListBox.ItemTemplate>
    <DataTemplate DataType="{x:Type vm:ChildViewModel}">
      <views:ChildView Width="auto" DataContext="{Binding}" />
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>
于 2013-03-22T11:53:01.087 に答える