MVVM 将 viewmodel 属性子级绑定到 viewmodel 属性

发布于 2024-11-07 19:19:33 字数 453 浏览 0 评论 0原文

不确定我的标题是否很好地解释了我遇到的问题。

在我的应用程序中,我进行了服务调用 - 检索客户列表。 - 检索组织列表。

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

在我的视图模型中,我具有以下属性:

IEnumerable<Organisation> Organisations 
ObservableCollection<Customer> Customers

组织属性:OrganizationId、OrganizationName

客户属性:CustomerId、OrganizationId、CustomerFirstName、CustomerLastName

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

在我看来,我该如何绑定这一点?我只想要一个文本块来显示客户的组织名称。

not sure if my title explains well the issue im having.

In my application i make a service calls to
-retrieve a list of customers.
-retrieve a list of organisations.

Then i bind this list of customers to a listbox on my view.

In my viewmodel i have the following properties:

IEnumerable<Organisation> Organisations 
ObservableCollection<Customer> Customers

Organisation properties: OrganisationId, OrganisationName

Customer properties: CustomerId, OrganisationId, CustomerFirstName, CustomerLastName

Inside the Listbox on my view i want to show the organisationname for each customer in the list.

how can i go about binding this in my view? I just want a textblock to show the organisationname for the customer.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

缱倦旧时光 2024-11-14 19:19:33

我将在客户 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 绑定到 CustomerViewModel 上的 OrgName 属性:

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

I'd flatten the Model in a customer ViewModel:

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

Then the owning ViewModel returns the collection of Customers:

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

Bind the ListBox to the OrgName property on the CustomerViewModel:

<ListBox>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding FirstName}"/>
                <TextBlock Text="{Binding OrgName}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
不一样的天空 2024-11-14 19:19:33

我会为此使用 MultiBinding 和 MultiValueConverter ,但遗憾的是,如果您按照标签所建议的那样仅限于 Silverlight,则这是不可能的...

I would employ a MultiBinding and a MultiValueConverter for this, this is sadly not possible if you are restricted to Silverlight as the tags suggest though...

亚希 2024-11-14 19:19:33

我同意 Ritch 的观点,您应该展平模型,但如果您真的不想这样做,您可以使用 IValueConverter。在您希望显示名称的位置的绑定中,如果将 Organizations 设置为另一个控件的数据上下文,则可以进行元素到元素绑定并在绑定中传递另一个控件的数据上下文,并在 ConverterParameter 中传递OrganizationId,然后在转换器代码中使用一点 LINQ 并返回您想要的名称

I agree with Ritch that you should flatten the model, but if you really don't want to do that, you could use an IValueConverter. In the binding for where you want the name to be displayed, if you set Organizations to be the datacontext of another control, you could do element-to-element binding and pass the other control's datacontext in the binding, and in the ConverterParameter pass the OrganizationId, then in the Converter code use a little LINQ and return the Name you want

甜尕妞 2024-11-14 19:19:33

将列表框绑定到从 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 的答案中绑定列表框即可。

附言。我是在手机上写的,所以代码可能不完美。

Bind the Listbox to a Linq query exposed from your 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}

};
}

Then just bind the listbox in Ritch's answer to this.

PS. I'm writing this on my phone so the code may not be perfect.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文