7

MVVM デザイン パターンを使用して WPF アプリケーションを開発しています。アプリケーションには、複数のボタンを表示する ItemsControl があります (アプリケーションのロジック フローによると、ボタンの数は一定ではありません)。ItemsControl は ViewModel の LinkedList にバインドされます。ボタンのコマンドを定義でき、コマンドにパラメーターがない場合にのみ ViewModel 内でコマンド ハンドラーを取得できます...どのボタンがクリックされたかを知る必要があるため、パラメータ付きのコマンド。

View を定義するにはどうすればよいですか? CommandParameter の構文と、ボタンのコンテンツを取得するために使用できるパラメーターは何ですか? ViewModel の Command シグネチャは何になりますか?

MVVM Light の RelayCommand を使用していることに注意してください。ビューの関連コードはこちらです。前もって感謝します

<UserControl x:Class="Museum.Controls.CategoriesView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="130" d:DesignWidth="418">
    <UserControl.Resources>
        <DataTemplate x:Key="CategoriesButtonsTemplate">
            <Button Content="{Binding }" 
                    Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, Path=DataContext.CategorySelectedCommand}" 
                    />
        </DataTemplate>
    </UserControl.Resources>
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="50"></RowDefinition>
            <RowDefinition Height=" 40"></RowDefinition>
            <RowDefinition Height=" 40"></RowDefinition>
        </Grid.RowDefinitions>
        <Grid x:Name="SubSubjectGrid" Grid.Row="0"></Grid>
        <Grid x:Name="CategoriesGrid" Grid.Row="1">
            <ItemsControl Grid.Row="1" 
                  ItemsSource="{Binding Path=CategoriesButtons}" 
                  ItemTemplate="{StaticResource CategoriesButtonsTemplate}" >
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal"  HorizontalAlignment="Stretch"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
     </Grid>
        <Grid x:Name="SelectedCategoryGrid" Grid.Row="2"></Grid>
    </Grid>  
</UserControl>
4

3 に答える 3

6

このように単純に CommandParameter="{Binding }" を使用できます

       <DataTemplate x:Key="CategoriesButtonsTemplate">
        <Button Content="{Binding }" 
                Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, Path=DataContext.CategorySelectedCommand}" 
                CommandParameter="{Binding }" 
                />
    </DataTemplate>
于 2013-10-07T05:43:37.243 に答える
1

MVVM Light ツールキットには、コマンド パラメーターを処理できる汎用 RelayCommand クラスがあります。非ジェネリック RelayCommand クラスはそれらを無視します。次に例を示します。

Ahmed が回答で示したように、最初に CommandParameter プロパティをバインドします。

    <Button Content="{Binding}" 
            Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, Path=DataContext.CategorySelectedCommand}" 
            CommandParameter="{Binding}" />

ビューモデルのボタンのリンクされたリストが文字列のリストであるとしましょう。ボタンのコンテンツと CommandParameter は、リスト項目の 1 つにバインドされています。ビューモデルにジェネリック RelayCommand プロパティを作成します。

 private RelayCommand<String> mOnClickCommand;

 public RelayCommand<String> ClickCommand
 {
     get { return mOnClickCommand; }         
 }

たとえば、コンストラクターで次のようにインスタンス化します。

 mOnClickCommand = new RelayCommand<string>(OnButtonClicked);

最後に、メソッドで CommandParameter プロパティをメソッド引数として取得します。

 private void OnButtonClicked(String _category)
 {
     Console.WriteLine(_category);
 }

これが役に立てば幸いです。

于 2013-10-07T14:13:56.113 に答える