У меня есть кнопки «ДОБАВИТЬ» и «УДАЛИТЬ», но «УДАЛИТЬ» не работает. Что не так?
счетчик в моем ObservableCollection<User> был изменен, но ListBox не
пример проекта: https://github.com/Veselov-Dmitry/MyQuestion
Посмотреть:
<StackPanel>
<Button Content = "ADD"
Command = "{Binding AddUsers_OASUCommand}"
CommandParameter = "">
</Button>
<ListBox ItemsSource = "{Binding Users_OASU}">
<ListBox.ItemTemplate>
<DataTemplate>
<WrapPanel>
<TextBlock Text = "{Binding Name}" />
<TextBlock Text = "{Binding Login}" />
<Button Content = "DEL"
Command = "{Binding DelUsers_OASUCommand}"
CommandParameter = "{Binding Path=Content,
RelativeSource = {RelativeSource Mode=FindAncestor ,
AncestorType = {x:Type ListBoxItem}}}">
<Button.DataContext>
<local:ViewModel />
</Button.DataContext>
</Button>
</WrapPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
Я устанавливаю datacontext в конструкторе MainView
viewvmodel:
class ViewModel
{
public event PropertyChangedEventHandler PropertyChanged;
public ObservableCollection<User> Users_OASU{get; set;}
public ICommand AddUsers_OASUCommand{get; set;}
public ICommand DelUsers_OASUCommand{get; set;}
public ViewModel()
{
Users_OASU = new ObservableCollection<User>(GetUsers());
AddUsers_OASUCommand = new Command<object>(arg => AddUsers_OASUMethod());
DelUsers_OASUCommand = new Command<object>(arg => DelUsers_OASUMethod(arg));
}
private void DelUsers_OASUMethod(object arg)
{
User find = Users_OASU.Where(x => x.Login == (arg as User).Login).FirstOrDefault();
Users_OASU.Remove(find);
}
private void AddUsers_OASUMethod()
{
Users_OASU.Add(new User("52221", "John X."));
}
private List<User> GetUsers()
{
List<User> list = new List<User>();
list.Add(new User("52222", "John W."));
list.Add(new User("52223", "John Z."));
list.Add(new User("52224", "John A."));
list.Add(new User("52225", "John M."));
return list;
}
}





«количество в моем ObservableCollection было изменено, а в ListBox - нет» - у вас есть несколько экземпляров ViewModel, количество было изменено, но не в отображаемой коллекции
вам необходимо правильно настроить DataTemplate, чтобы избежать этого
сначала каждая кнопка получит объект User для DataContext (он будет предоставлен ListBox из ItemsSource). Вы не должны декларировать новый <Button.DataContext>
во-вторых, DelUsers_OASUCommand объявлен в классе ViewModel, он доступен на уровне ListBox из DataContext. Соответственно измените путь привязки.
<DataTemplate>
<WrapPanel>
<TextBlock Text = "{Binding Name}" />
<TextBlock Text = "{Binding Login}" />
<Button Command = "{Binding DataContext.DelUsers_OASUCommand,
RelativeSource = {RelativeSource AncestorType=ListBox}}"
CommandParameter = "{Binding Path=Content,
RelativeSource = {RelativeSource Mode=FindAncestor, AncestorType = {x:Type ListBoxItem}}}"
Content = "DEL" />
</WrapPanel>
</DataTemplate>
Кроме того, я бы изменил DelUsers_OASUMethod, чтобы принимать пользователя в качестве аргумента
private void DelUsers_OASUMethod(object arg)
{
Users_OASU.Remove(arg as User);
}
и передайте CommandParameter следующим образом:
CommandParameter = "{Binding Path=.}"
или то же самое, но короче:
CommandParameter = "{Binding}"
Большое спасибо