WPF ListView Обновление источника из ListView - PullRequest
2 голосов
/ 14 сентября 2011

Привет, я пытаюсь сделать что-то вроде этого. Я хочу обновить источник ListView из самого ListView, чтобы мне не пришлось модифицировать источник в другом объекте, в котором есть ListView. Я хотел попробоватьудаление элементов из ListView, но, конечно, это не работает

void delete_Click (отправитель объекта, RoutedEventArgs e) {

        List<EntityObject> items = new List<EntityObject>();

        foreach (EntityObject item in listView.SelectedItems)
        {
            itemsToBeDeleted.Add(item);
        }

        OnDeleteItems(items);//Database delete logic in here

        listView.Items.Remove(items.First());//After DataBase delete also delete the item from the listview's source so that listView' itself will be updated too.

        listView.Refresh();

        listView.SelectedItem = null;
    }

, и я не хочу передавать список источников в ListView какссылка и обновление, которое в ListView выглядит следующим образом

public void SetList (ref List itemList) {

        sauce =itemlist;
        list.ItemsSource = itemList;

}


sauce.Items.Remove (items.First ());

Есть идеи?

1 Ответ

0 голосов
/ 14 сентября 2011

Могу ли я предложить провести исследование по использованию шаблона проектирования MVVM? Если вы сделаете это, вы найдете более чистый способ справиться с этим и другими сценариями. Например, предположим, у вас есть EntityObject человек (я полагаю, что вы используете EF), который вы хотите отобразить в списке и удалить, нажав кнопку. Сначала мы создадим ListBox, который будет содержать список:

    <ListBox x:Name="lst" DisplayMemberPath="Name" SelectionMode="Extended">
        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="IsSelected" Value="{Binding IsSelected}"/>
            </Style>
        </ListBox.ItemContainerStyle>            
    </ListBox>

Здесь вы указываете, что хотите отображать в списке (DisplayMemberPath), и привязываете выбор ListBox к свойству IsSelected объекта Person.

Тогда мы можем пойти дальше и связать ObservableCollection<Person> с этим ListBox:

//in code behind constructor, but should actually be in a ViewModel
var people = new ObservableCollection<Person>
                        {
                              new Person(false, "test1"),
                              new Person(true, "test2"),
                              new Person(true, "test3"),
                         };
lst.ItemsSource = people;


//Person class for completeness
public class Person
{
    public Person(bool isSelected, string name)
    {
        IsSelected = isSelected;
        Name = name;
    }

    public bool IsSelected { get; set; }
    public string Name { get; set; }
}

а затем убрать предметы при нажатии кнопки:

public void deleteClick(sender, args){
    var deleteme = people.Where(p => p.IsSelected).ToList();

    DoDeleteLogicInDB(deleteme);

    deleteme.ForEach(p => people.Remove(p));
    //remove it from the observablecollection, and the view will automatically update.
}

Надеюсь, это укажет вам правильное направление!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...