如何从列表框中获取项目的索引(列表包含与命令绑定的按钮而不是单击)

时间:2017-11-29 06:34:56

标签: c# wpf mvvm

我有包含按钮的列表框。我们可以添加任何按钮。我已经通过c#将按钮添加到名为“AddedButtonList”的列表中,并将该列表绑定如下:

 <Grid Grid.Column="1" Grid.ColumnSpan="1" Grid.Row="1" Grid.RowSpan="1">
        <Grid.Resources>
            <DataTemplate DataType="{x:Type viewModel:AddedAction}">
                <Button Content="{Binding Title}"
                        Height="40"
                        Width="100"
                        Command="{Binding Command}">
                </Button>
            </DataTemplate>
        </Grid.Resources>
        <ListBox  ItemsSource="{Binding actionsRecordVmObj.AddedActionsList}" Width="Auto">
        </ListBox>
    </Grid>

我们可以通过在xaml中使用上面的代码来添加任何按钮,因为我已经绑定了代码背后的所有属性。 背后的代码是:

 public abstract class AddedAction
    {
        public bool IsDisable { get; set; }
        public string Title { get; set; }
        public string ButtonIndex { get; set; }
        public abstract ICommand Command { get; }
    }



 public class AddedSourceFileActionVm : AddedAction
    {
        public ICommand _command;
        //constructor
        public AddedSourceFileActionVm()
        {
            Title = "Source File";
            _command = new RelayCommand(p => AddedSourceFileActionCommandExecuted(null), p => CanAddedSourceFileActionCommandExecute());
        }

所有按钮都与命令绑定 (按钮可能在列表中重复)。 我想获得按下的按钮索引(列表中的项目)。 我读了很多答案,其中一些人说使用AlternationCount但是当我想要代码背后的索引我无法做到这一点因为我使用Command进行绑定而且他们显示了click事件。 我不能用

    private void lstButton_Click(object sender, RoutedEventArgs e)
     {
                Button button = sender as Button;           
                int index = _myListBoxName.Items.IndexOf(button.DataContext); 
      }

因为我正在使用MVVM并且我使用命令绑定所有按钮。 所以请为此提出一些解决方案。

或简称如何获取从列表中按下的按钮的索引? 提前谢谢....

1 个答案:

答案 0 :(得分:3)

以下是您如何轻松获取索引:
1.在abstract上定义event AddedAction 2.创建event实例时订阅AddedAction 3.执行event时提高AddedAction.Command 4.获取事件处理程序的索引

例如:

public abstract class AddedAction
{
    //define the event
    public abstract event EventHandler CommandExecuted;

    public abstract ICommand Command { get; }
    //...
}
public class AddedSourceFileActionVm : AddedAction
{
    public override event EventHandler CommandExecuted;

    private void AddedSourceFileActionCommandExecuted(object obj)
    {
        //invoke the event
        CommandExecuted?.Invoke(this, null);
        //...
    }
    //...
}
public class ActionsRecordVm
{
    public List<AddedAction> AddedActionsList { get; } = new List<AddedAction>();
    public void AddNewAddedAction()
    {
        var addedAction = new AddedSourceFileActionVm();
        //Subscribe to the event
        addedAction.CommandExecuted += AddedAction_CommandExecuted;
        AddedActionsList.Add(addedAction);
    }

    private void AddedAction_CommandExecuted(object sender, EventArgs e)
    {
        //get the index
        int index = AddedActionsList.IndexOf((AddedAction)sender);

        //...
    }
    //...
}