我的项目是使用MVVM和C#。我已将我的按钮命令限制为RelayCommand,我希望获得有关我的按钮的信息。我希望得到这些信息,以便我可以在我的RelayCommand中使用它。不幸的是,我不知道如何将这些信息发送到我的RelayCommand,也不知道我需要在RelayCommand中接收哪些EventArgs来获取此信息。
<ListBox ItemsSource="{Binding Decoration}" x:Name="MyLB">
<ListBox.ItemTemplate>
<DataTemplate>
<Button BorderBrush="Transparent" BorderThickness="0" Command="{Binding DataContext.AddGearCommand, ElementName=MyLB}" >
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="50"/>
</Grid.ColumnDefinitions>
<Grid Grid.Column="0">
<View:ShielGear/>
</Grid>
<TextBlock Text="HEJ MED DIG LUDER" TextWrapping="Wrap" Grid.Column="1"/>
</Grid>
</Button>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
ShielGear包含一个Path元素,该按钮可以使其成形。 RelayCommand我将命令限制为:
AddGearCommand = new RelayCommand<T>(addGear);
private void addGear(T e)
{
}
此外,是否可以将多个Type解析为relaycommand? 我也不确定是否应该使用Commandparameters?
答案 0 :(得分:2)
如果您为ListBox
添加了名称,则可以使用CommandParameter
将SelectedIndex
作为参数发送
<ListBox x:Name="myListBox" ...>
在你的命令中
<Button BorderBrush="Transparent" BorderThickness="0" Command="{Binding DataContext.AddGearCommand, ElementName=MyLB}" CommandParameter="{Binding ElementName=myListBox, Path=SelectedIndex}">
然后,您的RelayCommand
声明将如下:
public RelayCommand<int> AddGearCommand { get; set; }
在你的命令中:
AddGearCommand = new RelayCommand<int>(selectedIndex =>
{
// do whatever you want
});
希望这有帮助
答案 1 :(得分:2)
您不应该从ViewModel访问按钮(UI元素)。这打破了关注点的分离,如果你需要重构UI,将会让你的生活变得困难。
而是向按钮绑定添加一个值,该值将您需要的数据传递到命令中。通常,这将是与listboxitem绑定的对象。
<Button Command="{Binding DataContext.AddGearCommand, ElementName=MyLB}" CommandParameter="{Binding}">
然后,您需要修改您的RelayCommand,以便使用您的数据元素的实际类型进行输入。
public RelayCommand<myDataType> AddGearCommand { get;set;}
答案 2 :(得分:0)
在Commandparameter中传递您的按钮名称,并在viewmodel中将您的参数转换为按钮。 现在您可以获得按钮的所有信息。
XAML:
<Button x:Name="btnPrint" MinWidth="70" Margin="5" Content="Print"
Command="{Binding Print}" CommandParameter="{Binding ElementName=btnPrint}" ></Button>
视图模型:
private RelayCommand _commandPrint;
public ICommand Print
{
get { return _commandPrint ?? (_commandPrint = new RelayCommand(param => this.PrintGrid(param), Canprint)); }
}
private void PrintGrid(object param)
{
var btn = param as Button;
}