如何判断哪个按钮被点击,动态生成? (MVVM)
问题描述:
我有食谱类的可观察到的集合和一个命令SearchResultsViewModel显示的食谱:如何判断哪个按钮被点击,动态生成? (MVVM)
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
另一个视图模型执行的查询,并且在这个视图模型的构造传递结果。 在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用绑定了一个视图,显示被点击方的属性,但我不知道如何 告诉哪个按钮被点击。 是否有可能在没有代码的情况下执行此操作?
答
您可以将命令属性移动到Recipe
类。然后每个Button
(或者每个数据对象由Button
表示)都有自己的命令,并且您始终知道哪个被点击。
如果Recipe
类是由某些ORM(例如Entity Framework)自动生成的,则可以在其中定义命令属性的另一部分类。
通过'CommandParameter'传递你需要的任何东西?我不知道你的'RelayCommand'实现是否支持这个场景(它应该),但最坏的情况是你自己实现'ICommand'。 – Maverik
将命令属性移动到食谱类? – mm8
@ mm8从数据库生成模型时可以这样做吗? –