Передача универсальной коллекции ObservableCollection в виде CommandParameter - PullRequest
0 голосов
/ 20 января 2019

Я использую много разных ViewModel для объектов, которые я отображаю в списках флажков.Все подклассы (Жираф и Слон) наследуются от основного класса Млекопитающих.Для каждого списка флажков есть кнопка, чтобы отменить их выбор.Я хотел бы использовать универсальный метод, который работает со всеми подклассами.Я думал о том, чтобы передать использованную коллекцию ObservableCollection в команду, просто нажав кнопку. К сожалению, я не могу динамически распознать, какой это подкласс, и привести его правильно.

XAML

<ListBox SelectionMode="Multiple" ItemsSource="{Binding Path=Giraffes, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding Path=Text}" IsChecked="{Binding Path=Checked}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

<Button Content="Clear" Command="{Binding ClearSelection}" CommandParameter="{Binding Path=Giraffes}" />

MainViewModel

private ICommand _clearSelection;
public ICommand ClearSelection
        {
            get
            {
                return _clearSelection ?? new RelayCommand((x) =>
                {

                    ObservableCollection<Giraffe> observableCollection = (ObservableCollection<Giraffe>) x;

                    foreach (var giraffe in giraffes)
                    {
                        giraffe.Checked = false;
                    }

                });
            }
        }

ViewModels

 public class MammalViewModel : BaseViewModel 
    {
        private bool _checked;

        public bool Checked
        {
            get => _checked;
            set
            {
                if (value == _checked) return;
                _checked = value;
                OnPropertyChanged("Checked");
            }
        }


        private string _text;
        public string Text
        {
            get => _text;
            set
            {
                if (value == _text) return;
                _text = value;
                OnPropertyChanged("Text");
            }
        }
    }

     public class GiraffeViewModel : MammalViewModel { }
     public class ElephantViewModel : MammalViewModel { }

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Правильный способ решения этой проблемы - приведение ObservableCollection<T> к IList, затем приведение каждого элемента IList к базовому классу.

public ICommand ClearSelection
{
    get
    {
        return _clearSelection ?? new RelayCommand((x) =>
        {
            IList coll = (IList) x;

            foreach (var obj in coll)
            {
                ((MammalViewModel)obj).Checked = false;
            }
        });
    }
}

Или вы также можете привести ObservableCollection<T> к IEnumerable, а затем использовать метод расширения Cast<TResult> для приведения всей коллекции к ObservableCollection<baseclass>.

public ICommand ClearSelection
{
    get
    {
        return _clearSelection ?? new RelayCommand((x) =>
        {
            ObservableCollection<MammalViewModel> coll = ((IEnumerable)x).Cast<ObservableCollection<MammalViewModel>();

            foreach (var obj in coll)
            {
                obj.Checked = false;
            }
        });
    }
}
0 голосов
/ 20 января 2019

Нашел решение:

 public ICommand ClearSelection
        {
            get
            {
                return _clearSelection ?? new RelayCommand((x) =>
                {
                    switch (x)
                    {
                        case ObservableCollection<GiraffeViewModel> giraffes:
                            DeCheckElements(giraffes);
                            break;
                        case ObservableCollection<ElephantViewModel> elephants:
                            DeCheckElements(elephants);
                            break;
                    }
                });
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...