Как передать выбранные элементы из ListBox в viewmodel и удалить их? - PullRequest
0 голосов
/ 25 сентября 2019

В моем коде у меня есть список, в котором я выбираю элементы с флажком внутри, и вопрос в том, как передать эти элементы в viewmodel и удалить их из списка

Вот мой код Xaml со списком

    </Border>
    <Border BorderThickness="1" BorderBrush="{DynamicResource ColumnHeaderBorder}" CornerRadius="7" Grid.Column="2" Grid.RowSpan="2" Grid.Row="0"/>
    <ListBox Grid.Row="0" Grid.Column="2" Foreground="#FFFFFF" Background="Transparent" BorderThickness="0"  Grid.RowSpan="2" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
             ScrollViewer.VerticalScrollBarVisibility="Visible" ItemsSource="{Binding TechTabList}"  Margin="5"
            BorderBrush="{x:Null}" SelectionMode="Multiple" x:Name="TechListBox">
        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="Focusable" Value="False"/>
            </Style>
        </ListBox.ItemContainerStyle>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Height="50" Width="auto">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="800"/>
                        <ColumnDefinition Width="170"/>
                    </Grid.ColumnDefinitions>
                    <Border Grid.ColumnSpan="3" BorderThickness="0,0,0,1" Margin="0,0,0,-1" BorderBrush="{DynamicResource NeonColor}" Opacity="1"/>
                    <StackPanel x:Name="StackPanel" Orientation="Horizontal" Grid.Column="0" >
                        <Viewbox Height="40" HorizontalAlignment="Center" VerticalAlignment="Center">
                            <CheckBox  Style="{StaticResource CheckBox}" Margin="0,0,3,0" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}},Path=IsSelected}"/>
                        </Viewbox>
                        <TextBlock Text="{Binding Name}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                    </StackPanel>

Вот моя модель представления с командой, где мне нужно удалить выбранные элементы

   ArchiveTable = new RelayCommand(_ArchiveTable);   
    }

    private void _ArchiveTable()
    {
        //Here foreach on selecteditems but how to pass them here 


    }

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Поскольку SelectedItems является свойством ReadOnly, вы не можете напрямую связать его с ним.
Чтобы удалить эти элементы из списка, нужно будет использовать другой тип RelayCommand.Например:

public class RelayCommand : ICommand
{
    private Action<object> _execute;
    private Predicate<object> _canExecute;

    public RelayCommand(Action<object> execute)
    {
        _execute = execute;
        _canExecute = (o) => true;
    }

    public RelayCommand(Action<object> execute, Predicate<object> canExecute)
    {
        _execute = execute;
        _canExecute = canExecute;
    }

    #region Implementation of ICommand

    public bool CanExecute(object parameter)
    {
        return _canExecute.Invoke(parameter);
    }

    public void Execute(object parameter)
    {
        _execute.Invoke(parameter);
        RaiseCanExecuteChanged();
    }

    public event EventHandler CanExecuteChanged;

    public void RaiseCanExecuteChanged()
    {
        CanExecuteChanged?.Invoke(this, EventArgs.Empty);
    }

    #endregion
}  

Как только вы это получите, вы можете использовать CommandParamater для Binding.Вот так:

<ListBox x:Name="TechTabList" ... />
<Button Content="Delete Selected Items" Command="{Binding ArchiveTable}" CommandParamater="{Binding ElementName=TechLabList, Path=SelectedItems}"/>  

Теперь в вашей реализации команды:

private void _ArchiveTable(object parameter)
{
    var items = (parameter as IList).Cast<YourTypeHere>();
    //now you can remove those from the collection
    foreach(...)
}
0 голосов
/ 25 сентября 2019

ListBox имеет свойство SelectedItems.Свяжите это, как и все другие свойства из вашей модели представления. документация

Затем необходимо удалить элементы из связанного списка и обновить пользовательский интерфейс.Я бы сделал это с помощью ObservableColletion в качестве источника для ListView. Аналогичная проблема , мне нравится ответ, который говорит об использовании INotifyCollectionChanged

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...