动态生成时如何判断单击了哪个按钮? (MVVM)

How to tell which Button has been clicked, when it's generated dynamically? (MVVM)

我有一个 SearchResultsViewModel,其中包含可观察的菜谱集合 class 和一个显示菜谱的命令:

    private ObservableCollection<Recipe> _searchedRecipes;
    public ObservableCollection<Recipe> SearchedRecipes
    {
        get
        {
            return _searchedRecipes;
        }
        set
        {
            _searchedRecipes = value;
            OnPropertyChanged();
        }
    }
    #endregion

    #region Show Recipe Command

    public ICommand ShowRecipeCommand { get { return new RelayCommand(() => 
    ExecuteShowRecipeCommand()); } }

    public void ExecuteShowRecipeCommand()
    {
        _locator.Main.CurrentViewModel = new DisplayRecipeViewModel();
    }
    #endregion

另一个 ViewModel 执行查询并将结果传递到此 ViewModel 的构造函数中。 在 SearchResultsViewModel 的 XAML 部分,结果动态显示为按钮。每个食谱都是一个按钮,其名称作为内容:

     <StackPanel>
            <ItemsControl ItemsSource="{Binding Path = SearchedRecipes}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Button Content="{Binding Path=Name}" Command="{Binding ShowRecipeCommand}"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </StackPanel>

我希望 ShowRecipeCommand 创建新的 DisplayRecipeViewModel 并绑定一个 View,显示被点击的 Recipe 的属性,但我不知道如何 告诉点击了哪个按钮。 是否可以在没有代码隐藏的情况下执行此操作??

您可以将命令 属性 移动到 Recipe class。然后每个 Button(或者更确切地说,每个由 Button 表示的数据对象)都有自己的命令,您总是知道点击了哪个。

如果 Recipe class 是由某些 ORM 自动生成的,例如 Entity Framework,您可以创建另一个部分 class,您可以在其中定义命令 属性.