MVVM绑定viewmodel属性child to viewmodel属性

时间:2011-05-16 23:39:50

标签: wpf silverlight mvvm binding

不确定我的头衔是否能解释我的问题。

在我的应用程序中,我拨打了一个服务电话 - 检查客户列表。 - 检查组织清单。

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

在我的viewmodel中,我有以下属性:

IEnumerable<Organisation> Organisations 
ObservableCollection<Customer> Customers

组织属性:OrganisationId,OrganisationName

客户属性:CustomerId,OrganisationId,CustomerFirstName,CustomerLastName

在我的视图中的列表框内,我想显示列表中每个客户的组织名称。

我怎么能在我看来绑定这个?我只想要一个文本块来显示客户的组织名称。

4 个答案:

答案 0 :(得分:4)

我在客户ViewModel中展平了模型:

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

然后拥有的ViewModel返回Customers集合:

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

将ListBox绑定到CustomerViewModel上的OrgName属性:

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

答案 1 :(得分:0)

我会为此使用MultiBindingMultiValueConverter,如果您被限制为Silverlight,这很可能是不可能的,因为标签建议尽管......

答案 2 :(得分:0)

我同意Ritch你应该压扁模型,但如果你真的不想这样做,你可以使用IValueConverter。在您希望显示名称的绑定中,如果将Organizations设置为另一个控件的datacontext,则可以执行元素到元素绑定并在绑定中传递其他控件的datacontext,并在ConverterParameter中传递在OrganizationId中,然后在Converter代码中使用一点LINQ并返回你想要的名称

答案 3 :(得分: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。我在手机上写这个,所以代码可能不完美。