使用 WPF 将一个列表与另一个列表绑定

2024-01-16

开门见山。我正在使用 MVVM 编写一个程序,并且制作了如下视图:

类结构:

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

class Material
{
    int ID
    string Name
    string Description
}

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

<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 的一部分:

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

公司是一个列表Company包含的对象Name, ID and MaterialList。公司列表显示在_companiesListView(上面的代码)。

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

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

我怎么做?我找到了一个解释这个概念的类似线程 https://stackoverflow.com/questions/15774560/wp8-xaml-binding-list-with-another-list-inside但就我而言我仍然做不到。我可以绑定到 SelectedItem 属性之一吗?


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

<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; }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 WPF 将一个列表与另一个列表绑定 的相关文章

随机推荐

  • 使用 QueryWithResultSet 的 dotnetrdf xml 异常

    我有一个 asp net 项目 我想在其中查询 DBPedia 使用以下代码我收到错误 public string testEndpoint TEST02 SparqlRemoteEndpoint endpoint new SparqlRe
  • 如何在 SwiftUI 中向 TextEditor 添加占位符文本?

    使用 SwiftUI 的新 TextEditor 时 您可以使用 State 直接修改其内容 但是 我还没有找到向其添加占位符文本的方法 现在可行吗 我添加了一个苹果在他们自己的翻译应用程序中使用的示例 这似乎是支持占位符文本的多行文本编辑
  • Unity Ads 4.0 - 奖励广告的多个 OnUnityAdsShowComplete 回调

    使用 Unity Ads SDK 上找到的奖励广告脚本时 我遇到了一个问题 ShowAd IUnityAdsShowListener gt OnUnityAdsShowComplete 增量触发调试日志 我观看的第一个广告返回一行 表明广告
  • gcc 4.8 或更早版本在正则表达式方面是否存在错误?

    我正在尝试在 C 11 代码中使用 std regex 但似乎支持有点错误 一个例子 include
  • “IE8 除外”的条件注释?

    我在用着针对 IE8 但我想为除 IE8 之外的所有浏览器加载一些 JS 我应该使用什么条件注释 编辑 我想知道这是否可行 Thanks 我想为除 IE8 之外的所有浏览器加载一些 JS 我应该使用什么条件注释 要使某些内容出现在不支持 C
  • 在 C/C++ 中声明和使用 FILE * 指针的正确方法是什么?

    在 C C 中声明和使用 FILE 指针的正确方法是什么 应该声明为全局的还是局部的 有人可以举一个很好的例子吗 无论是本地的还是全球的 根本不重要 文件指针的范围与其用途无关 一般来说 尽可能避免全局变量是个好主意 这是一个示例 展示了如
  • 查询中的累计总和

    如何返回行的累积和大于或小于指定值的行 table id count 1 30 2 10 3 5 4 20 5 15 query SELECT id count FROM table ORDER BY id HAVING SUM count
  • Windows 上的 OpenSSL 可以使用系统证书存储吗?

    我从 Linux 移植到 Windows 的一些工作 C 代码在 Windows 上失败 因为SSL get verify result 正在返回X509 V ERR UNABLE TO GET ISSUER CERT LOCALLY 该代
  • 使用 c_api.h 执行使用 tensorflow.contrib.resampler 的冻结张量流图

    我有一个冻结的张量流图 pb 格式 其中包含对 tensorflow contrib resampler 的调用 必须使用以下命令在 C 应用程序中加载和执行该调用 c api h 如果我调用以下命令 我就可以从 python 成功加载并执
  • 在django中显示多个条形图

    我是 django 的新手 对 python 知之甚少 我正在学习在 django 框架中绘制图表 我绘制了单个条形图 但在使用 django 项目的数据库 Telecom db 绘制多个条形图时遇到问题 然而 在 wxPython 中 以
  • 在全屏模式下检测事件更改 Internet Explorer

    我正在尝试编写一个事件处理程序来检测我拥有的视频播放器是否处于全屏模式或 常规 模式 我尝试过使用 document addEventListener fullscreenchange myfunc false 但这在 IE 中不起作用 我
  • 读取 NSUserDefaults 与变量的速度

    我有一个应用程序 它经常调用变量 这些变量存储在NSUserDefaults 我想知道在哪里NSUserDefaults正在存储 如果我打电话NSUserDefaults直接而不是使用变量 哪个更快 变量或NSUserDefaults 因为
  • 如何在 Visual Studio Code 上查看 C# Nuget Package 的源代码?

    当我们选择 转到定义 或 F12 或 CRTL 单击 时 有什么方法可以查看 Nuget 包的源代码吗 此时 我在代码中单击 CRTL 单击 Nuget Package 中的某个类 vscode 会显示程序集摘要 元数据 其中我只能看到文档
  • 从 Git 恢复文件?

    问题与问题相关 致命文件系统错误后如何恢复 Git https stackoverflow com questions 552832 how to restore git after fatal file system error 但对于单
  • 如何在不使用release分支的情况下使用git flow?

    有多家分店可供选择git flow 例如 feature release support hotfix bugfix 我不需要release 分支并想要合并staging分支 一个开发分支 直接到master 使用什么是实现此目的的最佳方法
  • C++11 在 constexpr 函数中使用统一值初始化数组

    我有一个类模板 它根据模板参数构建一个简单的数组作为其成员之一 我需要能够在构造函数之一中将数组中的每个元素初始化为单个值 不幸的是这个构造函数必须是constexpr 相关部分归结为 template
  • 每次循环递减

    是否可以在 Excel 的 VBA 中的每个循环中递减 我有这样的代码 Sub Makro1 Dim rng As Range Dim row As Range Dim cell As Range Set rng Range B1 F18
  • 无法从 .sql 文件创建存储过程 - JDBC

    我正在尝试使用 jdbc 在安装 Web 项目期间执行 sql 文件 谷歌建议的 2 个选项 手动解析脚本 通过拆分 字符 或使用 ant 我更喜欢简单的方式 所以 ant 是一个不错的选择 这是我用来设置数据库的代码 public voi
  • VFY:无法解析静态方法10876:Android

    我在程序中使用了 SmsCbMessage java 类 它取自http grepcode com file repository grepcode com java ext com google android android 4 0 1
  • 使用 WPF 将一个列表与另一个列表绑定

    开门见山 我正在使用 MVVM 编写一个程序 并且制作了如下视图 类结构 class Company int CompanyID string Name List