我有包含按钮的列表框。我们可以添加任何按钮。我已经通过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并且我使用命令绑定所有按钮。 所以请为此提出一些解决方案。
或简称如何获取从列表中按下的按钮的索引? 提前谢谢....
答案 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);
//...
}
//...
}