如何动态生成按钮,如何判断哪个按钮已被点击? (MVVM)

时间:2017-10-11 14:49:42

标签: c# wpf mvvm mvvm-light

我有一个SearchResultsViewModel,带有可观察的食谱类集合和一个显示食谱的命令:

    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的属性,但我不知道如何 告诉我点击了哪个按钮。 是否可以在没有代码的情况下执行此操作?

1 个答案:

答案 0 :(得分:0)

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

如果某些ORM(例如Entity Framework)自动生成Recipe类,则可以创建另一个用于定义命令属性的分部类。