私はMVVMLightを使用してWin10 UWPアプリに取り組んでいます(MVVMLightを使用したことはなく、コマンドを「適切に」実行したこともありません)。ObservableCollection にバインドされた ItemsControl があります。参加者には、Name と Laps の 2 つのプロパティがあります。ItemsControl.ItemTemplate には、ボタン (減算)、アイテムの Name プロパティ、アイテムの Laps プロパティ、および別のボタン (追加) を表示するためのコントロールがあります。XAML は次のとおりです。
<ItemsControl
ItemsSource="{Binding Participants, Mode= TwoWay}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid
MinWidth="300"
Margin="0, 12">
<Grid.ColumnDefinitions>
<ColumnDefinition
Width="2*"></ColumnDefinition>
<ColumnDefinition
Width="6*"></ColumnDefinition>
<ColumnDefinition
Width="2*"></ColumnDefinition>
<ColumnDefinition
Width="3*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button
Content=""
FontFamily="Segoe MDL2 Assets"
FontSize="20"
Grid.Column="0"
Margin="0, 0, 12, 0"></Button>
<TextBlock
Text="{Binding Path=Name, Mode=TwoWay}"
FontSize="20"
FontWeight="Bold"
Grid.Column="1"></TextBlock>
<TextBlock
Text="{Binding Laps, Mode=TwoWay}"
FontSize="20"
FontWeight="Bold"
Grid.Column="2"></TextBlock>
<Button
Content=""
FontFamily="Segoe MDL2 Assets"
FontSize="20"
Command="{Binding AddLapCommand}"
CommandParameter="{Binding}"
Grid.Column="3"
Margin="12, 0, 0, 0"></Button>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
ビュー モデルは、参加者と呼ばれる ObservableCollection を作成します。追加ボタン (そしてもちろん減算ボタン) を VM の RelayCommand にバインドしようとしています。いろいろ試してみたので、ここで試したすべてを投稿することはできません。これが私が持っている最新のものです(ただし、まだ機能しません):
public RelayCommand<object> AddLapCommand
{
get
{
if (_addLapCommand == null)
{
_addLapCommand = new RelayCommand<object>((e) => ExecuteAddLapCommand(e));
}
return _addLapCommand;
}
}
private void ExecuteAddLapCommand(object o)
{
throw new NotImplementedException();
}
xaml のインテリセンスは、LapCounter.Model.Participant 型のデータ コンテキストでプロパティ AddLapCommand を解決できないことを示しています。Participant クラスではなく、ページの DataContext である HomeViewModel クラスにアクセスしようとしています。ItemsControl がバインドされているコレクション内の個々のアイテムから、LapCounter.Model.Participant がどこから取得されているかがわかると思います。しかし、DataContext が見つからない場合は、正しいものが見つかるまでビジュアル ツリーを上っていくという印象を受けました。ページ宣言の DataContext は次のとおりです。
DataContext="{Binding Home, Source={StaticResource Locator}}"
RelayCommand の VM を確認するにはどうすればよいですか? 私がする必要があるのは、ボタンが表す Participant をパラメーターとして RelayCommand に送信し、それを使用してその特定の参加者の Laps 整数をインクリメント (減算ボタンの場合はデクリメント) することです。
私が得ることができる助けに感謝します。ありがとう!
編集 ビューが更新されていないため、VM から参加者プロパティを表示するように追加しました。参加者プロパティは次のとおりです。
/// <summary>
/// The <see cref="Participants" /> property's name.
/// </summary>
public const string ParticipantsPropertyName = "Participants";
private ObservableCollection<Participant> _participants = new ObservableCollection<Participant>();
/// <summary>
/// Sets and gets the Participants property.
/// Changes to that property's value raise the PropertyChanged event.
/// </summary>
public ObservableCollection<Participant> Participants
{
get
{
return _participants;
}
set
{
if (_participants == value)
{
return;
}
_participants = value;
RaisePropertyChanged(() => Participants);
}
}
ここまで助けてくれた Eldar Dordzhiev に感謝します!