我正在使用MVVM设计模式开发WPF应用程序。 在应用程序中,我有一个ItemsControl,它显示了几个按钮(根据应用程序的逻辑流程,按钮数量不是恒定的)。 ItemsControl绑定到ViewModel中的LinkedList。 我能够为Buttons定义一个Command,只有在Command没有参数的情况下才能在ViewModel中获取Command处理程序... 我需要能够知道哪个按钮被点击了,因此我希望有一个带参数的命令。
如何定义视图? CommandParameter的语法是什么,我可以使用哪个参数来获取Button内容? ViewModel中的Command签名是什么?
请注意我正在使用MVVM Light中的RelayCommand。 View的relvant代码就在这里。 提前致谢
<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>
答案 0 :(得分:7)
你可以像这样使用CommandParameter =“{Binding}”
<DataTemplate x:Key="CategoriesButtonsTemplate">
<Button Content="{Binding }"
Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, Path=DataContext.CategorySelectedCommand}"
CommandParameter="{Binding }"
/>
</DataTemplate>
答案 1 :(得分:1)
MVVM Light工具包中有一个通用的RelayCommand类,可以处理命令参数。非泛型RelayCommand类忽略它们。这是一个例子:
首先绑定你的CommandParameter属性,就像Ahmed在他的回答中所示:
<Button Content="{Binding}"
Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, Path=DataContext.CategorySelectedCommand}"
CommandParameter="{Binding}" />
让我们说viewmodel中按钮的链接列表是一个字符串列表。您的按钮内容和CommandParameter绑定到您的一个列表项。现在在viewmodel中创建一个通用的RelayCommand propterty:
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);
}
希望这有用。
答案 2 :(得分:0)
您可以使用Interactivity和Iteractions库。在这种情况下,您应该将其添加到按钮的xaml代码中:
<Button>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:CallMethodAction TargetObject="{Binding}" MethodName="OnClick"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
并查看模型:
public void OnClick(object sender, MouseEventArgs args)
{// your code }