привязка определенных элементов из списка к источнику списка - PullRequest
1 голос
/ 21 августа 2010

У меня есть список со многими элементами, и у меня есть поле со списком в C # WPF.

Я бы хотел связать источник элементов в выпадающем списке со списком, но я хочу отфильтровать некоторые элементы (это источник данных xml, я хочу отфильтровать содержимое определенного элемента элемента item) , Пример позиции:

    <Item>
<itemtype>A</itemtype>
<itemname>Name</itemname>
</item>

    <Item>
<itemtype>B</itemtype>
<itemname>Name</itemname>
</item>

Я думал о ручном добавлении элемента в выпадающий список при добавлении элемента в список, но затем значение «имя» элемента не обновляется при его изменении в списке.

Какой хороший способ сделать это? Допустим, я хочу показать все имена элементов только с типом элемента B. Может ли это быть сделано в привязке wpf или мне нужно сделать какой-нибудь код позади?

Ответы [ 2 ]

2 голосов
/ 21 августа 2010

Это ссылка на источник данных, например, на коллекцию в вашей модели представления, если вы используете шаблон MVC.Удивительно, что он настолько прост в использовании.Представление обновлено и имеет собственную обработку обновления.Я приведу небольшой пример:

В WPF:

<ListBox ItemsSource={Binding Path=MySource} ItemTemplate="{StaticResource myItemTemplate}" />

Логика кода:

public class Item
{
    public string Name { get; set; }
    public string Type { get; set; }
}

public class MyViewModel
{
    public ObservableCollection<Item> MySource { get; set; }

    public MyViewModel()
    {
        this.MySource = new ObservableCollection<Item>();
        this.MySource.Add(new Item() { Name = "Item4", Type = "C" });
        this.MySource.Add(new Item() { Name = "Item1", Type = "A" });
        this.MySource.Add(new Item() { Name = "Item2", Type = "B" });
        this.MySource.Add(new Item() { Name = "Item3", Type = "A" });

        // get the viewsource

        ListCollectionView view = (ListCollectionView)CollectionViewSource
            .GetDefaultView(this.MySource);

        // first of all sort by type ascending, and then by name descending
        view.SortDescriptions.Add(new SortDescription("Type", ListSortDirection.Ascending));
        view.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Descending));

        // now i like to group the items by type
        view.GroupDescriptions.Add(new PropertyGroupDescription("Type"));

        // and finally i want to filter all items, which are of type C
        // this is done with a Predicate<object>. True means, the item will
        // be shown, false means not
        view.Filter = (item) =>
            {
                Item i = item as Item;
                if (i.Type != "C")
                    return true;
                else
                    return false;
            };


        // if you need a refreshment of the view, because of some items were not updated
        view.Refresh();

        // if you want to edit a single item or more items and dont want to refresh,
        // until all your edits are done you can use the Edit pattern of the view

        Item itemToEdit = this.MySource.First();
        view.EditItem(itemToEdit);
        itemToEdit.Name = "Wonderfull item";

        view.CommitEdit();

        // of course Refresh/Edit only makes sense in methods/callbacks/setters not
        // in this constructor
    }

}

Интересно, что этот шаблон напрямую влияет на список вграфический интерфейсЕсли вы добавите группировку / сортировку, это повлияет на поведение отображения списка, даже если источник элементов связан только с моделью представления.

2 голосов
/ 21 августа 2010

Проблема с Binding в этом случае заключается в том, что он устанавливается только один раз. Так что, если вы связываете это, источники синхронизированы. Вы можете использовать конвертер для привязки, который фильтрует элементы, которые вы не любите связывать. Еще один способ - использовать замечательный WPF CollectionViewSource.

Вы можете добавить группировки / сортировки и фильтр к CollectionViewSource для любого типа ItemsSource. Например, используйте ListCollectionView.

ListCollectionView view = 
   (ListCollectionView)CollectionViewSource.GetDefaultView(yourEnumerableSource);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...