0

Есть 2 вьюмодели, основная и вьюмодель, которая соответствует созданной коллекции

Основная вьюмодель - MainVM. В ней есть команда, имитирующая логику получения, создания и добавления вьюмодели для данной коллекции, а так же добавление полученной коллекции в класс модели данных для последующей работы с ней.

public class MainVM : Notify
    {
        public ObservableCollection<CollectionVM> CollectionsVM { get; }

        public ICommand AddSampleCollectionCommand { get; }

        private Collections _collections;

        public MainVM()
        {
            _collections = new Collections();
            CollectionsVM = new ObservableCollection<CollectionVM>();
            AddSampleCollection = new RelayCommand(AddSampleCollection);
        }

        private void AddSampleCollection()
        {
            var collection = new List<SimpleType>();
            var vmForCollection = new CollectionVM()
            {
                Title = "Test title"
            };

            _collections.Add(collection);
            CollectinsVM.Add(_collectinsVM);
        }
    }

Вьюмодель коллекции - CollectionVM

public class CollectionVM : Notify
    {
        public string Title { get; }

        //Проблема в реализации этой команды.
        public ICommand DeleteCommand { get; }
    }

Класс для хранения коллекций - Collections. Я не стал копировать его полностью, а описал его структуру кратко.

public class Collections
    {
        private List<List<SimpleType>> _collestions;

        public void Add(List<SimpleType> item) => _collestions.Add(item);
        public void Delete(List<SimpleType> item) => _collestions.Remove(item);
    }

Сама разметка xaml имеет примерно такой вид. Для отображения вьюмоделей я взял ItemsControl (Мне нужно просто отображать элементы, выделять и т.д их не нужно, по этому и взял его)

<ItemsControl x:Name="CollectionsList"
              HorizontalContentAlignment="Stretch"
              ItemsSource="{Binding CollectionsVM}"
              ItemTemplate="{StaticResource CollectionDataTemplate}"
              BorderThickness="0">
</ItemsControl>

Ну и xaml ДатаТемплейта

<DataTemplate x:Key="CollectionDataTemplate">
        <StackPanel>
            <TextBlock Text="{Binding Title}"/>
            <Button x:Name="DeleteButton"
                    Command="{Binding DeleteCommand}"/>
        </StackPanel>
</DataTemplate>

Проблема следующая, мне нужно по клику кнопки DeleteButton удалять соответствующую вьюмодель и экземпляр коллекции из класса Collections. Т.к между вьюмоделью и нужным экземпляром класса нету никакой связи, я не понимаю как реализовать удаление и того и другого. Думал добавить во вьюмодель коллекции свойство со ссылкой на нужный экземпляр коллекции, но мне сказали, что так лучше не делать. Подскажите как это грамотно реализовать и возможно что-то полностью переделать в коде выше. Спасибо

  • У вас по сути 3 варианта. 1. Передать ссылку в нужный VM на тот, где у вас нужная команда/действие (... new CollectionVM(this);). Я не знаю почему вам говорят, что это не правильно, вполне стандартное решение. 2. В CollectionVM реализовать событие, которое будет оповещать о том, что объект надо удалить. При инициализации нового объекта этой VM подписываетесь и выполняете нужные действия. 3. Сделать команду удаления на слой выше (вытащить из CollectionVM) и привязать ее через RelativeSource(FindAncestor) в XAML. – EvgeniyZ Mar 28 '19 at 23:18
  • Вспомогательные ссылки: Вариант 2 - один из моих старых ответов. В нем я по таймеру вызывал событие на удаление. Вариант 3 - например этот ответ. – EvgeniyZ Mar 28 '19 at 23:21
  • В общем сделаю свойство с ссылкой, спасибо – Александр Mar 29 '19 at 00:48

0 Answers0