获取控件的信息

时间:2013-10-14 08:17:24

标签: c# wpf button mvvm windows-phone-8

我的项目是使用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?

3 个答案:

答案 0 :(得分:2)

如果您为ListBox添加了名称,则可以使用CommandParameterSelectedIndex作为参数发送

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

    }