使用 WPF 将列表与另一个列表绑定 [英] Binding a list with another list with WPF

查看:46
本文介绍了使用 WPF 将列表与另一个列表绑定的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

直奔主题.我正在使用 MVVM 编写一个程序,并且我做了一个这样的视图:

Straight to the point. I'm writing a program using MVVM and I have made a view like this:

类结构:

class Company    
{
    int CompanyID
    string Name
    List<Material> MaterialList
}

class Material
{
    int ID
    string Name
    string Description
}

这是我的视图的 XAML 代码(删除了大部分不相关的内容以使其更具可读性):

Here is the XAML code of my View (deleted most of the irrelevant stuff to make it more readable):

<ListView x:Name="_companies" ItemsSource="{Binding ElementName=_this, Path=ItemsSource}" SelectedItem="{Binding ElementName=_this, Path=SelectedItem}">
       <ListView.View>
            <GridView>
                <GridViewColumn Header="ID" DisplayMemberBinding="{Binding CompanyID}" />
                <GridViewColumn Header="Company Name" DisplayMemberBinding="{Binding CompanyName}" />
            </GridView>

...

    <ListView x:Name="_materials" >
        <ListView.View>
            <GridView>
                <GridViewColumn Header="ID" DisplayMemberBinding="{Binding ElementName=_companies, Path=SelectedItem.MaterialID}"/>
                <GridViewColumn  Header="Name" DisplayMemberBinding="{Binding ElementName=_companies, Path=SelectedItem.Name"/>
            </GridView>
        </ListView.View>
    </ListView>

    <TextBox x:name="_description" Text="{Binding Description}" IsReadOnly="True" />
</StackPanel>

以及我的 MainView 的一部分:

And a part of my MainView:

<Window.DataContext>
    <viewModels:CompanyListViewModel />
</Window.DataContext>
<Grid>
<view:CompanyListView ItemsSource="{Binding Companies}" />

Companies 是包含 NameIDMaterialListCompany 对象列表.公司列表显示在 _companies ListView(上面的代码)中.

Companies is a list of Company objects containing Name, ID and MaterialList. The Companies list is displayed in the _companies ListView (code above).

现在从列表中选择一家公司后,我想在 _materials ListView 中显示分配的 MaterialList.

Now after selecting a company from the list I want to display the assigned MaterialList in the _materials ListView.

_materials 中选择材料后,我想在 _description TextBox 中显示其描述

After selecting a material in _materials I want to display its description in the _description TextBox

我该怎么做?我找到了一个解释这个概念的类似线程,但我仍然在我的情况下不能这样做.我可以绑定到 SelectedItem 属性之一吗?

How do I do that? I found a similar thread that explains the concept but I still can't do it in my case. Can I bind to one of the SelectedItem properties ?

推荐答案

参考以下代码.我已经使用 MVVM 完成了它.您需要使用列表视图的 SelectedItem 属性并绑定到 chid 数据列表视图.

Refer the below code. I have done it using MVVM. You need use SelectedItem property of the listview and bind to the chid data listview.

<StackPanel>
    <ListView x:Name="_companies" ItemsSource="{Binding Companies}" >
        <ListView.View>
            <GridView>
                <GridViewColumn Header="ID" DisplayMemberBinding="{Binding ID}" />
                <GridViewColumn Header="Company Name" DisplayMemberBinding="{Binding Name}" />
            </GridView>
        </ListView.View>
    </ListView>
    <ListView x:Name="_materials" ItemsSource="{Binding ElementName=_companies,Path=SelectedItem.MaterialList}" >
        <ListView.View>
            <GridView>
                <GridViewColumn Header="ID" DisplayMemberBinding="{Binding ID}"/>
                <GridViewColumn  Header="Name" DisplayMemberBinding="{Binding Name}"/>
            </GridView>
        </ListView.View>
    </ListView>
    <TextBox x:Name="_description" Text="{Binding ElementName=_materials, Path=SelectedItem.Description}" IsReadOnly="True" />
</StackPanel>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new MainViewModel();
    }
}
  class MainViewModel 
{      

    private ObservableCollection<Company> companies;

    public ObservableCollection<Company> Companies
    {
        get { return companies; }
        set { companies = value; }
    }        

    public MainViewModel()
    {
        companies = new ObservableCollection<Company>();

        for (int i = 0; i < 10; i++)
        {
            Company comp = new Company();
            comp.ID = i + 1;
            comp.Name = "Comp" + i;
            ObservableCollection<Material> matlist = new ObservableCollection<Material>();
            for (int j = 0; j < 10; j++)
            {
                Material mat = new Material();
                mat.ID = j + 1;
                mat.Name = "Mat" + j + i;
                mat.Description = "descrp" + j + i;
                matlist.Add(mat);
            }
            comp.MaterialList = matlist;
            companies.Add(comp);
        }            
    }
}

class Company 
{
    private int id;

    public int ID
    {
        get { return id; }
        set { id = value; }
    }

    private string name;

    public string Name
    {
        get { return name; }
        set { name = value;  }
    }
    private ObservableCollection<Material> materialList;

    public ObservableCollection<Material> MaterialList
    {
        get { return materialList; }
        set { materialList = value; }
    }       
}

class Material 
{
    private int id;

    public int ID
    {
        get { return id; }
        set { id = value; }
    }

    private string name;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    private string description;

    public string Description
    {
        get { return description; }
        set { description = value; }
    }
}

这篇关于使用 WPF 将列表与另一个列表绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆