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

#wpf #mvvm #listbox

#wpf #mvvm #listbox

Вопрос:

Я новичок в MVVM, а также довольно новичок в WPF. На самом деле я начал программировать всего несколько месяцев назад. MVVM действительно помогает мне разобраться с концепцией привязки, и я уже несколько дней пытаюсь просто создать приложение, которое позволяет вам выбирать элемент из listbx, и когда вы нажимаете на кнопку добавить, выбранный элемент должен быть сохранен в новом списке. Во втором списке отображаются последние добавленные элементы, и вы можете выбрать элемент и удалить его с помощью другой кнопки. обычно я бы использовал событие click и украсил свою привязку к коду симпатичными маленькими методами, но я действительно хочу научиться делать все это с помощью привязок и без привязки к коду. Я был бы чрезвычайно рад любой помощи, и, пожалуйста, помните, что я новичок в этом, и я действительно хочу, чтобы это было как можно проще 🙂 с наилучшими пожеланиями, Даниэла

 <WrapPanel HorizontalAlignment="Center" Margin=" 10">
   <ListBox x:Name="Firstbox" 
            Width="100"
            ItemsSource="{Binding FoodList}"
            DisplayMemberPath="Name" >
   </ListBox>
   <Button Margin="10 >Select</Button>
   <ListBox Width="100"></ListBox>
  

закрытый список _foodList;

     public List<FoodItem> FoodList
    {
        get { return _foodList; }
        set { _foodList = value; }
    }

    private List<FoodItem> _newFoodList;

    public List<FoodItem> NewFoodList
    {
        get { return _newFoodList; }
        set { _newFoodList = value; }
    }

    public MainViewModel()
    {
        InitializeCommands();
        GetFood();
    }
    private void GetFood()
    {
        FoodList = new List<FoodItem>()
        {
            new FoodItem() {Name="Applepie"}, 
            new FoodItem() {Name="Scones"}
        };
    }
  

Комментарии:

1. У меня не так много кода : (Понятия не имею, как это сделать : (

2. если я могу предложить вам прочитать книгу о MVVM, и тогда вы сможете легко это сделать. Но чтобы помочь вам прямо сейчас выполнить эту задачу, вам пришлось бы реализовать ICommands, а затем привязать их к вашему свойству команды buttons. Это очень легко сделать, и вы можете найти множество примеров, которые помогут вам.

Ответ №1:

  • во-первых, вам нужно заменить List s на ObservableCollection s, чтобы пользовательский интерфейс мог определять, когда добавляются новые элементы.
  • Добавьте SelectedItem свойство к вашей ViewModel:

     private FoodItem _selectedItem;
    public FoodItem SelectedItem
    {
        get { return _selectedItem;}
        set
        {
            _selectedItem = value;
            OnPropertyChanged("SelectedItem");
        }
    }
      
  • привяжите SelectedItem свойство 1-го ListBox к этому свойству:

     <ListBox Width=" 100" x:Name="Firstbox"
             ItemsSource="{Binding FoodList}"
             DisplayMemberPath="Name"
             SelectedItem="{Binding SelectedItem}" />
      
  • привяжите свой 2-й ListBox к NewFoodList свойству

  • создайте команду в вашей ViewModel:

     private DelegateCommand _addItemCommand;
    public ICommand AddItemCommand
    {
        get
        {
            if (_addItemCommand == null)
            {
                _addItemCommand = new DelegateCommand(AddItem);
            }
            return _addItemCommand;
        }
    }
    
    void AddItem()
    {
        if (SelectedItem != null)
            NewFoodList.Add(SelectedItem);
    }
      
  • И, наконец, привяжите Command свойство button к AddItemCommand свойству:

     <Button Margin="10" Command="{Binding AddItemCommand}" >Select</Button>
      

Комментарии:

1. Большое спасибо за вашу помощь! Я получаю: «Ссылка на объект не установлена для экземпляра объекта» в методе AddItem, у вас есть какие-либо идеи, почему?

2. При отладке я вижу, что элемент выбран, но он не добавлен в NewFoodList.

3. @Daniela, тебе нужно инициализировать свойство NewFoodList в конструкторе: NewFoodList = new ObservableCollection<FoodItem>();

4. краснеть было неловко! Спасибо 🙂