Как обновить ListBox при изменении ItemsSource - PullRequest
0 голосов
/ 14 мая 2018

У меня есть кнопки «ДОБАВИТЬ» и «УДАЛИТЬ», но «УДАЛИТЬ» не работает. Что не так?

счетчик в моем 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;
    }
}

1 Ответ

0 голосов
/ 14 мая 2018

«счетчик в моей коллекции 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}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...