0

ResourceButtonClick次の xaml コードでは、ビュー モデルにあるRelayCommand をバインドしようとしています。それに加えて、Resource.Idこのコマンドにパラメーターとして を渡したいと思います。

ただし、ResourceButtonClick呼び出されません。ItemsSourceを に設定することResourcesで、ビュー モデルであるデータ コンテキストをオーバーライドしたと思われます。

<UserControl ...>
    <Grid>
        <ItemsControl ItemsSource="{Binding Resources}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Button Tag="{Binding Id}" Content="{Binding Content}"
                    Width="300" Height="50"
                    Command="{Binding ResourceButtonClick}"
                    CommandParameter="{Binding Id}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
</UserControl>

これRelayCommandがビューモデルです。

public RelayCommand<int> ResourceButtonClick { get; private set; }

ビュー モデルのコンストラクター:

public ResourcesViewModel()
{
    this.ResourceButtonClick = 
        new RelayCommand<int>((e) => this.OnResourceButtonClick(e));
}

ビューモデルのメソッド:

private void OnResourceButtonClick(int suggestionId)
{
...
}

2 つの質問があります。まず、ResourceButtonClickコマンドを呼び出すにはどうすればよいですか。Resource.Id次に、そのコマンドにパラメーターとして渡すにはどうすればよいですか。

任意の提案をいただければ幸いです。

4

2 に答える 2

2

たぶん、完全なViewModelクラスを表示できますか?ResourceButtonClickコマンドがコレクションResourcesも保持するViewModelにあると仮定すると、間違ったオブジェクト( Resourcesコレクションとコマンドを保持するViewModelではなく、Resourcesのアイテム)でコマンドにアクセスしようとしています。

したがって、「その他」のDataContextでコマンドにアクセスする必要があります。これは、ItemsControlのDataContextであり、そのアイテムではありません。最も簡単な方法は、バインディングのElementName属性を使用することです。

<UserControl ...>
    <Grid>
        <ItemsControl ItemsSource="{Binding Resources}" Name="ResourcesItemsControl">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Button Tag="{Binding Id}" Content="{Binding Content}"
                    Width="300" Height="50"
                    Command="{Binding DataContext.ResourceButtonClick, ElementName=ResourcesItemsControl}"
                    CommandParameter="{Binding Id}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
</UserControl>

これで問題が解決するかもしれませんが、そうでない場合はお知らせください。詳細をお知らせください。

私は通常、アイテム全体をIDではなくCommandParameterとして渡します。これには何の費用もかかりませんし、IDをアイテムに戻す必要もありません。しかし、それはあなたのケースに依存します。

お役に立てれば。

于 2013-03-05T13:46:48.153 に答える
0

私はこれを次のように解決しました:View.xamlで

1) ListView にプロパティ SelectedItem を追加しました。

<ListView Name="MyList" ItemsSource="{Binding MyList}" SelectedItem="{Binding MySelectedItem, Mode=TwoWay}" >

2) コマンド プロパティをボタンに追加しました。

viewModel: 3) コマンド ハンドラーを追加しました。

MyCommand = new RelayCommand(MyMethod);

4) MySelectedItem プロパティから値を取得するメソッド MyMethod を追加しました。

private void MyMethod ()
       {
            MyType mt = MySelectedItem;
            //now you have access to all properties of your item via mt object
        }
于 2013-04-02T12:52:54.130 に答える