#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. краснеть было неловко! Спасибо 🙂