ObservableCollection 上的“Cascade”绑定,包含其他 ObservableCollection

2024-06-08

我有一个项目需要显示合同列表(Class Affaire)。 每个合约都有一个阶段列表(类别阶段)。 我使用绑定在 2 个不同的 ListView 中显示它们中的每一个。 问题是当我从 ListView 中删除一个 Phase 时,显示 Phases 的 ListView 和我的 ObjectCollection 都不会更新。

我创建了一个具有两个不同 ObservableCollection 的上下文:

ObservableCollection,其中是 Affaire 的列表。 ObservableCollection 是所选事务中存在的阶段列表

我的上下文如下:

public class Contexte : INotifyPropertyChanged
    {
        private Affaire selectedAffaire;
        private Phase selectedPhase;
        private Assemblage selectedAssemblage;
        public Affaire SelectedAffaire
        {
            get { return selectedAffaire; }
            set
            {
                selectedAffaire = value;
                this.NotifyPropertyChanged("SelectedAffaire");
            }
        }
        public Phase SelectedPhase
        {
            get { return selectedPhase; }
            set
            {
                selectedPhase = value;
                this.NotifyPropertyChanged("SelectedPhase");
            }
        }
        public Assemblage SelectedAssemblage
        {
            get { return selectedAssemblage; }
            set
            {
                selectedAssemblage = value;
                this.NotifyPropertyChanged("SelectedAssemblage");
            }
        }
        private ObservableCollection<Affaire> listeDesAffaires;
        public ObservableCollection<Affaire> ListeDesAffaires
        {
            get { return listeDesAffaires; }
            set { NotifyPropertyChanged(ref listeDesAffaires, value); }
        }
        /**************************************************/

        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged(string nomPropriete)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(nomPropriete));
        }

        private bool NotifyPropertyChanged<T>(ref T variable, T valeur, [CallerMemberName] string nomPropriete = null)
        {
            if (object.Equals(variable, valeur)) return false;

            variable = valeur;
            NotifyPropertyChanged(nomPropriete);
            return true;
        }

    }

我的课堂事件:

public class Affaire : INotifyPropertyChanged
    {
        public long ID { get; set; }
        private string nom;
        public string Nom
        {
            get { return this.nom; }
            set
            {
                if (this.nom != value)
                {
                    this.nom = value;
                    this.NotifyPropertyChanged("Nom");
                }
            }
        }
        private string code;
        public string Code
        {
            get { return this.code; }
            set
            {
                if (this.code != value)
                {
                    this.code = value;
                    this.NotifyPropertyChanged("Code");
                }
            }
        }
        private string comm;
        public string Comm
        {
            get { return this.comm; }
            set
            {
                if (this.comm != value)
                {
                    this.comm = value;
                    this.NotifyPropertyChanged("Comm");
                }
            }
        }
        private ObservableCollection<Phase> listPhases;
        public ObservableCollection<Phase> ListPhases {
            get { return listPhases; }
            set
            {
                listPhases = value;
                if (PropertyChanged != null)
                {
                    NotifyPropertyChanged("ListPhases");
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged(string propName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
    ....
    }

我的班级阶段:

public class Phase : INotifyPropertyChanged
    {
        private string nomPhase;
        public string NomPhase
        {
            get { return this.nomPhase; }
            set
            {
                if (this.nomPhase != value)
                {
                    this.nomPhase = value;
                    this.NotifyPropertyChanged("NomPhase");
                }
            }
        }
        private int priorite;
        public int Priorite
        {
            get { return this.priorite; }
            set
            {
                if (this.priorite != value)
                {
                    this.priorite = value;
                    this.NotifyPropertyChanged("Priorite");
                }
            }
        }
        private string commPhase;
        public string CommPhase
        {
            get { return this.commPhase; }
            set
            {
                if (this.commPhase != value)
                {
                    this.commPhase = value;
                    this.NotifyPropertyChanged("CommPhase");
                }
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged(string propName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
        public long IdAffaire { get; set; }
        public long ID { get; set; }
        private ObservableCollection<Assemblage> listAssemblages;
        public ObservableCollection<Assemblage> ListAssemblages
        {
            get { return listAssemblages; }
            set
            {
                listAssemblages = value;
                if (PropertyChanged != null)
                {
                    NotifyPropertyChanged("ListAssemblages");
                }
            }
        }
    ...
    }

1)当我双击合同(在 ListView1 中)时,我在 ListView2 中显示其阶段列表,我执行以下操作:

contexte.SelectedAffaire = (Affaire)ListView1.SelectedItem;
contexte.SelectedAffaire.getListPhases();
afficherListview("2");

2)当我编辑我的阶段时,所有内容都在我的视图中以及我的 ObservableCollection 中正确更新

3)对于添加/删除新阶段,一切都解决了。

Edit :

Netstep 给出的示例完美运行,但我仍然遇到一个问题:

我有第三级“Assembly”,这是“Phase”类中的一个 ObservableCollection,我可以毫无问题地使用四个 ListView 进行导航,但是当我想做其他事情时遇到问题:当我右键单击“Phase”的标题,我想在程序集列表中显示 Affaire 中包含的所有程序集的列表,而不对阶段进行过滤。 为此,我执行以下操作:我位于第三级列表视图组件上,右键单击阶段标题,事件如下:

Phase ph = new Phase();
                ph.IdAffaire = contexte.SelectedAffaire.ID;
                ph.ListAssemblages = new ObservableCollection<Assemblage>(contexte.SelectedAffaire.getListAssemblages(true));
                contexte.SelectedPhase = ph;

我“拉屎”了一下,创建了一个新的空阶段,只是为了将 ObservableCollection 放入其中并将 ObservableCollection 绑定到我的 ListView3。Edit :这部分代码工作得很好...我只是刷新了代码中某处的上下文,然后忘记了它,确定出价中有问题...一切都解决了,谢谢


这是基于您的来源的示例,它将处理所有内容。 视图模型:

使用 System.Collections.ObjectModel; 使用 System.ComponentModel;

命名空间 WpfApp2 { 公共类 BaseViewModel :INotifyPropertyChanged { 公共事件 PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string nomPropriete)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(nomPropriete));
    }
}

public class Contexte : BaseViewModel
{
    private Affaire _selectedAffaire;
    private Phase _selectedPhase;
    public ObservableCollection<Affaire> ListeDesAffaires { get; set; }

    public Affaire SelectedAffaire
    {
        get { return _selectedAffaire; }
        set
        {
            _selectedAffaire = value;
            this.NotifyPropertyChanged("SelectedAffaire");
        }
    }

    public Phase SelectedPhase
    {
        get { return _selectedPhase; }
        set
        {
            _selectedPhase = value;
            this.NotifyPropertyChanged("SelectedPhase");
        }
    }

    public Contexte()
    {
        ListeDesAffaires = new ObservableCollection<Affaire>
        {
            new Affaire("Affaire1"),
            new Affaire("Affaire2")
        };
    }
}

public class Affaire : BaseViewModel
{
    private string nom;
    public string Nom
    {
        get { return this.nom; }
        set
        {
            this.nom = value;
            this.NotifyPropertyChanged("Nom");
        }
    }

    public ObservableCollection<Phase> ListPhases { get; set; }

    public Affaire(string n)
    {
        nom = n;
        ListPhases = new ObservableCollection<Phase>
        {
            new Phase { NomPhase = nom + "_Phase1" },
            new Phase { NomPhase = nom + "_Phase2" }
        };
    }
}

public class Phase : BaseViewModel
{
    private string nomPhase;
    public string NomPhase
    {
        get { return this.nomPhase; }
        set
        {
            this.nomPhase = value;
            this.NotifyPropertyChanged("NomPhase");
        }
    }

    public ObservableCollection<Assemblage> ListAssemblages { get; set; }
}

public class Assemblage : BaseViewModel
{
    private string nom;
    public string Nom
    {
        get { return this.nom; }
        set
        {
            this.nom = value;
            this.NotifyPropertyChanged("Nom");
        }
    }

}

}

MainWindow.xaml:

<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:Contexte x:Name="Contexte" d:IsDataSource="True" />
    </Window.DataContext>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1*"/>
        </Grid.ColumnDefinitions>
        <ListBox ItemsSource="{Binding ListeDesAffaires}" DisplayMemberPath="Nom" SelectedItem="{Binding SelectedAffaire}"/>
        <ListBox Grid.Column="1" ItemsSource="{Binding SelectedAffaire.ListPhases}" DisplayMemberPath="NomPhase" />
        <Button Grid.Column="2" VerticalAlignment="Top" Click="FillClick">Fill</Button>
        <ListBox Grid.Column="2" ItemsSource="{Binding SelectedPhase.ListAssemblages}" DisplayMemberPath="Nom" Margin="0,20,0,0"/>
    </Grid>
</Window>

以及您问题中的一些代码(MainWindow.xaml.cs):

using System.Collections.ObjectModel;
using System.Windows;

namespace WpfApp2
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void FillClick(object sender, RoutedEventArgs e)
        {
            Phase ph = new Phase();
            ph.NomPhase = "SomeId";
            ph.ListAssemblages = new ObservableCollection<Assemblage>()
            {
                new Assemblage { Nom =  "Assemblage1" },
                new Assemblage { Nom =  "Assemblage2" }
            };
            Contexte.SelectedPhase = ph;
        }
    }
}

这是结果:

这是您可以扩展的基本示例。它处理所有字段修改和添加/删除对象并显示在屏幕上。 MainWindow.xaml.cs 中没有其他代码。如果有问题,请提问。

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

ObservableCollection 上的“Cascade”绑定,包含其他 ObservableCollection 的相关文章

随机推荐

  • 在 PHP 页面中嵌入 svn 修订号的简单方法?

    注意到这个页面的右下角有 SVN 修订 ID 了吗 我假设这是动态的 我很乐意将其添加到我的一些网站中 就像源代码中的注释一样 以确保代码推送顺利进行 注意 您还可以假设相关站点的工作目录是相关存储库的 svn checkout Edit
  • 如何自定义解析错误的 HTTP 400 响应?

    我编写了一个 REST API 服务 要求所有响应均为 JSON 但是 当 Go HTTP 请求解析器遇到错误时 它会返回 400 作为纯文本响应 而不会调用我的处理程序 例子 gt curl i H Authorization Basic
  • 无法使用“class”作为 NSDictionary 中的键

    我正在尝试使用一个类作为NSDictionary 我看了答案这个问题 https stackoverflow com questions 730076 using class as key in nsdictionary我所拥有的几乎是一样
  • 在 Cuda 中简单添加两个 int,结果始终相同

    我开始了学习Cuda的旅程 我正在玩一些 hello world 类型的 cuda 代码 但它不起作用 我不知道为什么 代码非常简单 取两个整数并将它们添加到 GPU 上并返回结果 但无论我将数字更改为什么 我都会得到相同的结果 如果数学那
  • Outlook API 1.3 版本未显示在 Outlook Desktop Professional Plus 2016 上

    在本页https github com OfficeDev office js docs blob master reference outlook tutorial api requirement sets md https github
  • NUnit 测试运行顺序

    默认情况下 nunit 测试按字母顺序运行 有谁知道有什么方法可以设置执行顺序吗 是否存在这样的属性 我只是想指出 虽然大多数受访者认为这些是单元测试 但问题并没有具体说明它们是 nUnit 是一个很棒的工具 可用于各种测试情况 我可以看到
  • Jenkins 插件 ssh-agent 显示“错误:无法运行 ssh-add”

    我收到错误 错误 无法运行 ssh add 我正在尝试 ssh 进入远程机器 所以 SSH credential are set Pipeline script is calling ssh agent On executing the j
  • 禁止docker使用特定网络

    有没有办法告诉 docker 在运行时不要使用某些特定网络docker compose up 我正在使用一些开箱即用的示例 hyperledger 并且每次 docker 获取一个地址都会破坏我的远程连接 xxx xxx fabric do
  • 用于创建类似于 StackOverflow 的分页 UI/链接的淘汰赛模板

    我有一个用于某些分页 UI 的功能 Knockout 模板 可与基于 Knockout 的共享数据网格配合使用 该模板为网格中的每个数据 页面 呈现一个 HREF 该模板可以工作 但它很笨重 因为如果我获取大量数据 那么我最终会在网格下方出
  • 解密Javascript源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我已经编写了一段 JavaScrip
  • java.sql.SQLException: - ORA-01000: 超出最大打开游标数

    我收到 ORA 01000 SQL 异常 所以我有一些与之相关的疑问 最大打开游标是否与 JDBC 连接数完全相关 或者它们也与我们为单个连接创建的语句和结果集对象相关吗 我们正在使用连接池 有没有办法配置数据库中语句 结果集对象的数量 如
  • 经常访问 NSUserDefaults

    在我的应用程序的逻辑处理过程中 我需要频繁访问用户首选项 并多次访问 10 15 次 以确定需要处理什么以及如何处理 也许这个问题不是关于性能的问题 而是关于正确执行的问题 目前我正在做一个 NSUserDefaults standardU
  • 群组名称不能以数字开头?

    看来我不能使用像这样的正则表达式 P lt 74xxx gt 0 9 重新打包会引发错误 sre constants error bad character in group name u 74xxx 我似乎无法使用以数字开头的组名称 为什
  • 如何使聚合物元素可拖动

    我正在尝试启用HTML5 拖放到自定义聚合物元素上但它不起作用 如果没有聚合物 可以只添加draggable属性 这是我在 Dart 中的代码 我的组件 html
  • 在 pandas eval 中调用 round()、ceiling()、floor()、min()、max()

    正如标题所说 有没有办法在 pandas eval 中支持 round ceiling min max floor 函数 数据框 import pandas as pd import numexpr as ne op d ID 1 2 3
  • 如何在Android中绘制钟形曲线?

    我正在尝试在 Android 中绘制钟形曲线 正态分布 我使用这个方程 自己增加x轴并获得相对于x轴的y轴坐标 for int i 0 i lt 1000 i x float i 0 5 yy float 1 Math sqrt 0 5 M
  • 使用 Pytest 捕获 SystemExit 消息

    我正在使用 pytest 编写测试 我遇到了一些函数抛出异常的情况SystemExit如果输入错误 终端上会显示一些错误消息 我想为以下情况编写测试SystemExit抛出并验证输出错误消息中是否有特定字符串 这是代码 def test v
  • 错误 C2064:术语不计算为采用 1 个参数的函数

    class Student bool Graduate return m bGraduate class School vector
  • WSDL 表示中的枚举类型

    WSDL 表示如下
  • ObservableCollection 上的“Cascade”绑定,包含其他 ObservableCollection

    我有一个项目需要显示合同列表 Class Affaire 每个合约都有一个阶段列表 类别阶段 我使用绑定在 2 个不同的 ListView 中显示它们中的每一个 问题是当我从 ListView 中删除一个 Phase 时 显示 Phases