Как привязать список в WPF к общему списку? - PullRequest
3 голосов
/ 11 ноября 2010

У меня проблемы с получением четкого ответа на этот вопрос. У меня есть класс Static (DataHolder), который содержит статический список со сложным типом (свойства CustomerName и CustomerID). Я хочу привязать его к ListBox в WPF, но добавлю еще один элемент, который будет иметь слово «All» для будущих возможностей перетаскивания. Кто-нибудь?

Ответы [ 3 ]

2 голосов
/ 11 ноября 2010

Создайте класс ViewModel, к которому вы можете привязать данные!ViewModel может ссылаться на статический класс и копировать элементы в свою собственную коллекцию и добавлять в нее весь элемент.

Как это

public class YourViewModel
{
        public virtual ObservableCollection<YourComplexType> YourCollection
        {
            get
            {
                var list = new ObservableCollection<YourComplexType>(YourStaticClass.YourList);
                var allEntity = new YourComplexType();

                allEntity.Name = "all";
                allEntity.Id = 0;

                list.Insert(0, allEntity);

                return list;
            }

        }
}

Обратите внимание, что иногда вам нужны пустые элементы.Поскольку WPF не может привязать данные к нулевым значениям, вам нужно использовать тот же подход для обработки.Пустой бизнес-объект был лучшей практикой для этого.Просто погуглите.

1 голос
/ 11 ноября 2010

Этот элемент «Все» должен быть частью списка, с которым вы связываете свой ListBox.Естественно, вы не можете добавить этот элемент в список DataHolder, поскольку он содержит элементы типа Customer (или аналогичные).Конечно, вы можете добавить «волшебного» покупателя, который всегда действует как «все», но по понятным причинам это серьезный случай запаха дизайна (в конце концов, это список покупателей).

Что выможет сделать, это не связывать напрямую со списком DataHolder, но ввести оболочку.Эта обертка будет вашей ViewModel.Вы должны привязать свой ListBox к списку CustomerListItemViewModel, который представляет либо клиента, либо элемент «Все».

CustomerViewModel
{
    string Id { get; private set; }
    string Name { get; set; }
    public static readonly CustomerViewModel All { get; private set; }

    static CustomerViewModel()
    {
       // set up the one and only "All" item
       All = new CustomerViewModel();
       All.Name = ResourceStrings.All;
    }


    private CustomerViewModel()
    {
    }

    public CustomerViewModel(Customer actualCustomer)
    {
        this.Name = actualCustomer.Name;
        this.Id = actualCustomer.Id;
    }
}

someOtherViewModel.Customers = new ObservableCollection<CustomerViewModel>();
// add all the wrapping CustomerViewModel instances to the collection
someOtherViewModel.Customers.Add(CustomerViewModel.All);

А затем в вашем коде перетаскивания где-нибудь в ViewModel:

if(tragetCustomerViewModelItem = CustomerViewModel.All)
{
     // something was dropped to the "All" item
}

Я мог только что познакомить вас с преимуществами MVVM в WPF.Это экономит вам много хлопот в долгосрочной перспективе.

0 голосов
/ 11 ноября 2010

Если вы используете связывание, то данные, предоставленные в качестве источника, должны содержать все элементы, т.е. Вы не можете связать данные и затем добавить еще один элемент в список.

Вы должны добавить элемент «Все» в коллекцию DataHolder и обрабатывать элемент «Все» отдельно в своем коде.

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