动态生成时如何判断单击了哪个按钮? (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,您可以在其中定义命令 属性.
我有一个 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,您可以在其中定义命令 属性.