1

У меня есть вот такой код:

<ListBox Name="Player" ItemsSource="{Binding }" Height="200" Width="300">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Margin="2">
                        <TextBlock Text="ID : " Margin="2"/>
                        <TextBlock Text="{Binding Id}" Margin="2"/>
                        <TextBlock Text="Name : " Margin="2"/>
                        <TextBlock Text="{Binding Name}" Margin="2"/>
                        <Button Width="20"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Как мне сделать так, чтобы можно было удалять элемент из ObservableCollection при нажатии на кнопку, которая находится в одной строчке с элементом?

введите сюда описание изображения

Костя
  • 11
  • 3

1 Answers1

-1

Можно использовать команду с параметром. Команда находится как правило на том уровне где и список. Нужно перейти на этот уровень и привязать ее. Для этой цели можно привязывать через ElementName:

Command="{Binding ElementName=listbox, Path=DataContext.RemovePlayerCommand}"

и передавать в качестве параметра сам объект(просто оставить пустой binding):

CommandParameter="{Binding }"

в итоге выглядеть будет так:

<ListBox Name="listbox" ItemsSource="{Binding Players}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Margin="2">
                <TextBlock Text="ID : " Margin="2"/>
                <TextBlock Text="{Binding Id}" Margin="2"/>
                <TextBlock Text="Name : " Margin="2"/>
                <TextBlock Text="{Binding Name}" Margin="2"/>
                <Button Width="60" Content="удалить" 
                        Command="{Binding ElementName=Player, Path=DataContext.RemovePlayerCommand}"
                        CommandParameter="{Binding }"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>  

VM:

public class MainVM : BaseVM
{
    DelegateCommand<Player> removePlayerCommand;
public ICommand RemovePlayerCommand
{
    get
    {
        if (removePlayerCommand == null)
        {
            removePlayerCommand = new DelegateCommand&lt;Player&gt;(removePlayerExecute);
        }
        return removePlayerCommand;
    }
}

private void removePlayerExecute(Player obj)
{
    Players.Remove(obj);
}

public ObservableCollection&lt;Player&gt; Players { get; set; }

public MainVM()
{
    Players = new ObservableCollection&lt;Player&gt;();

    Players.Add(new Player() { Id = 1, Name = &quot;ETH&quot; });
    Players.Add(new Player() { Id = 2, Name = &quot;BTC&quot; });
}

}

Gardes
  • 3,358
  • Вы используете не чистый WPF, а какой-то MVVM фреймворк. Указывайте в ответе, какой и почему. – aepot Feb 02 '21 at 18:00
  • @aepot, нет, чистый. Реализацию DelegateCommand можно найти в интернете, либо заменить на RelayCommand, которую также можно найти. – Gardes Feb 03 '21 at 05:06
  • Так напишите об этом в ответе, и про BaseVM тоже. – aepot Feb 03 '21 at 08:36
  • @aepot, вы слишком зациклены на написании развернутых ответов. то что BaseVM это реализация INPC, а DelegateCommand - ICommand итак понятно и не всегда расписывалось в аналогичных ответах... – Gardes Feb 03 '21 at 12:55
  • Без проблем, ваше право. – aepot Feb 03 '21 at 13:14