MVVM привязка дочернего свойства viewmodel к свойству viewmodel - PullRequest
4 голосов
/ 17 мая 2011

не уверен, что мой заголовок хорошо объясняет проблему, с которой я столкнулся.

В моем приложении я звоню в сервис -получить список клиентов. - восстановить список организаций.

Затем я связываю этот список клиентов со списком на мой взгляд.

В моей модели просмотра у меня есть следующие свойства:

IEnumerable<Organisation> Organisations 
ObservableCollection<Customer> Customers

Свойства организации: идентификатор организации, имя организации

Свойства клиента: CustomerId, OrganisationId, CustomerFirstName, CustomerLastName

Внутри списка в моем представлении я хочу показать название организации для каждого клиента в списке.

как я могу связать это, на мой взгляд? Я просто хочу, чтобы текстовое поле показывало название организации для клиента.

Ответы [ 4 ]

4 голосов
/ 17 мая 2011

Я бы сгладил модель в клиенте ViewModel:

class CustomerViewModel : INotifyPropertyChanged
{
    public string OrgName { get; }
    public string FirstName {get; }
    public string LastName { get; }
}

Тогда владелец ViewModel возвращает коллекцию клиентов:

public class StoreViewModel : INotifyPropertyChanged
{
    public ObservableCollection<CustomerViewModel> Customers { get; }
}

Привязать ListBox к свойству OrgName вCustomerViewModel:

<ListBox>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding FirstName}"/>
                <TextBlock Text="{Binding OrgName}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
0 голосов
/ 17 мая 2011

Свяжите Listbox с запросом Linq, предоставляемым из вашей ViewModel.

Public IEnumerable ItemsView
{
get { 
return 
    {
    from customer in this.Customers
    from org in this.Organisations
    where customer.OrganisationId=org.OrganisationId
    select new { FirstName=customer.FirstName, LastName=customer.LastName, OrganisationName=org.OrganisationName}

};
}

Тогда просто свяжите список в ответе Ритча на это.

PS. Я пишу это на своем телефоне, поэтому код может быть не идеальным.

0 голосов
/ 17 мая 2011

Я согласен с Ritch, что вам следует сгладить модель, но если вы действительно не хотите этого делать, вы можете использовать IValueConverter. В привязке к тому месту, где вы хотите, чтобы имя отображалось, если вы задали для организаций значение datacontext другого элемента управления, вы можете выполнить привязку элемент-к-элементу и передать datacontext другого элемента в привязке, а в ConverterParameter передать OrganizationId, затем в коде конвертера используйте маленький LINQ и верните желаемое имя

0 голосов
/ 17 мая 2011

Я бы использовал MultiBinding и MultiValueConverter для этого, к сожалению, это невозможно, если вы ограничены Silverlight, хотя теги предполагают, что ...

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