2

私は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="&#xE108;"
                                    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="&#xE710;"
                                    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 に感謝します!

4

1 に答える 1

1

これを試して:

Command="{Binding Home.AddLapCommand, Source={StaticResource Locator}}"

あなたが書いたことがすべて完全に正しい限り、あなたに説明することはあまりありません。

のインクリメント/デクリメントに関してはLaps、単純に をParticipantコマンド ハンドラに渡してLaps. で行われるMVVMLightを使用する場合RelayCommand<Participant>Participantinを渡すことを忘れないでくださいCommandParameter

于 2016-04-19T21:39:18.823 に答える