2011-05-16 134 views
4

不知道我的标题是否解释我有问题。MVVM绑定viewmodel属性子视图模型属性

在我的应用程序中,我拨打 的服务电话 - 检索客户列表。 - 检索组织列表。

然后我将这个客户列表绑定到我的视图上的列表框。

在我的视图模型我有以下特性:

IEnumerable<Organisation> Organisations 
ObservableCollection<Customer> Customers 

组织属性:OrganisationId,OrganisationName

客户属性:客户编号,OrganisationId,CustomerFirstName,CustomerLastName

在我看来,列表框里面我想在列表中显示每个客户的组织名称。

我该如何去约束这在我看来?我只想要一个文本块来显示客户的组织名称。

+0

所以基本上你想要一个类似关系数据库的名称查找使用ID? – 2011-05-16 23:49:37

回答

4

我拼合模式在客户视图模型:

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

然后所属的视图模型返回客户的集合:

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

绑定列表框对CustomerViewModel的ORGNAME属性:

<ListBox> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding FirstName}"/> 
       <TextBlock Text="{Binding OrgName}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
0

我将采用一个MultiBinding和这个MultiValueConverter,这是可悲的是不可能的,如果你被限制的Silverlight作为标签建议,但...

0

我Ritch同意,你应该扁平化的模式,但是如果你真的不想这样做,你可以使用一个IValueConverter。在你希望显示名称的地方绑定,如果你将组织设置为另一个控件的datacontext,你可以做元素到元素的绑定,并在绑定中传递另一个控件的datacontext,并在ConverterParameter中传递OrganizationId,然后在转换器代码中使用一点LINQ并返回您想要的名称

0

将列表框绑定到从您的ViewModel公开的Linq查询。

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} 

}; 
} 

然后只是在Ritch的答案绑定列表框。

PS。我在我的手机上写这个代码可能不完美。

相关问题