对ObservableCollection的“级联”绑定,包含其他ObservableCollection

时间:2017-12-11 07:43:57

标签: c# binding observablecollection

我有一个项目需要显示合同列表(Class Affaire)。 每份合同都有一个阶段清单(阶段阶段)。 我使用绑定在2个不同的ListView中显示它们。 问题是我从ListView中删除了一个阶段,也没有显示阶段的Lis​​tView,也没有更新我的ObjectCollection。

我使用两个不同的ObservableCollection创建了一个上下文:

ObservableCollection,Affaire列表在哪里。 ObservableCollection是选定Affaire中存在的阶段列表

我的上下文如下:

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;
        }

    }

My Class Affaire:

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)对于添加/删除新阶段,所有问题都已解决。

修改:

Netstep给出的例子很完美,但我仍遇到问题:

我有第三级“程序集”,这是类“阶段”中的ObservableCollection,使用四个ListView导航没有问题,但是当我想要制作别的东西时遇到问题:当我正确的时候 - 单击“阶段”的标题,我想在Assembly列表中显示Affaire中包含的所有程序集的列表,而不在Phase上过滤。 为此,我执行以下操作:我在第3级listview程序集中,我右键单击Phase标题,事件如下:

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

我“搞”了一个新的空相,只是在里面放一个ObservableCollection并将ObservableCollection绑定到我的ListView3。 编辑:这部分代码效果很好......我只是在我的代码中的某个地方刷新了上下文并忘记了它,确定在biding中出现了问题...所有解决了谢谢

1 个答案:

答案 0 :(得分:1)

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

使用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;
        }
    }
}

结果如下:

Result

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