2

我的项目正在使用带有 C# 的 MVVM。我已将我的按钮命令绑定到 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)
    {

    }

此外,是否可以将多个类型解析到中继命令?我也不确定是否应该使用命令参数?

4

3 回答 3

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
});

希望这可以帮助

于 2013-10-14T08:42:37.240 回答
2

您不应该从 ViewModel 访问按钮(UI 元素)。这打破了关注点的分离,如果您需要重构 UI,以后会让您的生活变得困难。

相反,向按钮绑定添加一个值,该值会将您需要的数据传递到命令中。通常,这将是绑定到您的 listboxitem 的对象。

<Button Command="{Binding DataContext.AddGearCommand, ElementName=MyLB}" CommandParameter="{Binding}">

然后您需要修改您的 RelayCommand 以使用您的数据元素的实际类型键入。

public RelayCommand<myDataType> AddGearCommand { get;set;}
于 2013-10-14T08:45:38.987 回答
0

在命令参数中传递您的按钮名称,并在视图模型中将您的参数转换为按钮。现在您可以获得按钮的所有信息。

XAML:

<Button x:Name="btnPrint"  MinWidth="70" Margin="5"  Content="Print" 
                            Command="{Binding Print}" CommandParameter="{Binding ElementName=btnPrint}" ></Button>

视图模型:

私有 RelayCommand _commandPrint;

    public ICommand Print
    {
        get { return _commandPrint ?? (_commandPrint = new RelayCommand(param => this.PrintGrid(param), Canprint)); }
    }

私人无效打印网格(对象参数)

    {

        var btn = param as Button;

    }
于 2013-10-14T08:35:37.347 回答