使用 WPF 将列表与另一个列表绑定 [英] Binding a list with another list with 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 是包含 Name
、ID
和 MaterialList
的 Company
对象列表.公司列表显示在 _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屋!