Cannot resolve property 'myObservableCollectio

2019-08-31 23:37发布

问题:

I have a class called Stockage which inherit of INotifyPropertyChanged. this class set some strings and then create an ObservableCollection of ObservableCollections. This ObservableCollection send values to the several strings set before.

Like this:

public class Stockage:INotifyPropertyChanged
{
    public string Flag { get; set; }
    public string GroupeAlerte { get; set; }
    public string Pmid { get; set; }
    public string LibellePmrq { get; set; }
    public string Ligne { get; set; }
    public string Otm { get; set; }
    public string Totm { get; set; }
    public string LibelleTotm { get; set; }
    public string Discipline { get; set; }
    public string DisciplineSubstituee { get; set; }
    public string Remarque { get; set; }

    public static ObservableCollection<Stockage> result = new ObservableCollection<Stockage>();

    public static ObservableCollection<Stockage> Load(ObservableCollection<Resultat> listResult,
        ObservableCollection<D98Equipements> equipementses, 
        ObservableCollection<D98Details> detailses, 
        ObservableCollection<D675> d675Ses, 
        ObservableCollection<Activite> activitees)
    {

        foreach (var resultat in listResult)
        {

            result.Add(new Stockage{Flag=activitees.FirstOrDefault(e=>resultat.TOTMPMRQ == e.PMRQTOTMActivite).Flag.ToString(), 
                Pmid = listResult.FirstOrDefault(e=>resultat.TOTMPMRQ == e.TOTMPMRQ).TOTMPMRQ.Substring(0,8),
                LibellePmrq = listResult.FirstOrDefault(e => resultat.TOTMPMRQ == e.TOTMPMRQ).LibelléTOTApres,
                GroupeAlerte = listResult.FirstOrDefault(e => resultat.TOTMPMRQ == e.TOTMPMRQ).Groupe_D_alerte,
                Ligne = listResult.FirstOrDefault(e => resultat.TOTMPMRQ == e.TOTMPMRQ).TOTMPMRQ.Substring(8, 2),
                Otm = listResult.FirstOrDefault(e=>resultat.TOTMPMRQ == e.TOTMPMRQ).TOTMPMRQ.Substring(10,8),
                Totm = listResult.FirstOrDefault(e=>resultat.TOTMPMRQ == e.TOTMPMRQ).TOTMPMRQ.Substring(18,2),
                LibelleTotm = equipementses.FirstOrDefault(e=>resultat.TOTMPMRQ == e.PMRQTOTM).Libellé,
                Discipline = detailses.FirstOrDefault(e=>resultat.TOTMPMRQ == e.TOTMPMRQ).Discipline,
                DisciplineSubstituee = detailses.FirstOrDefault(e=>resultat.TOTMPMRQ == e.TOTMPMRQ).Discipline,
                Remarque = listResult.FirstOrDefault(e => resultat.TOTMPMRQ == e.TOTMPMRQ).Remarque,
            });


        }
        return result;
    }


    **public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }**

the ObservableCollections are set in an other class called ViewModel and inherit of INotifyPropertyChanged too:

class ViewModel:INotifyPropertyChanged
{
    private BDDInterneEntities _BDDInterneEntities;

    public ViewModel()
    {
        _BDDInterneEntities = new BDDInterneEntities();
        ResultatCollection = new ObservableCollection<Resultat>(_BDDInterneEntities.Resultat);
        D98EquipementsCollection = new ObservableCollection<D98Equipements>(_BDDInterneEntities.D98Equipements);
        D98DetailsCollection = new ObservableCollection<D98Details>(_BDDInterneEntities.D98Details);
        D675Collection = new ObservableCollection<D675>(_BDDInterneEntities.D675);
        ActiviteCollection = new ObservableCollection<Activite>(_BDDInterneEntities.Activite);


    }
    public ObservableCollection<Resultat> ResultatCollection { get; set; }
    public ObservableCollection<D98Equipements> D98EquipementsCollection { get; set; }
    public ObservableCollection<D98Details> D98DetailsCollection { get; set; }
    public ObservableCollection<D675> D675Collection { get; set; }
    public ObservableCollection<Activite> ActiviteCollection { get; set; } 


    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string property)
    {
        if(PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }

    }

I want to send the ObservableCollection of ObservableCollections (result) to a DataGrid, so I bind the DataGrid to the collection and then I bind each DataGridTextColumn with it's corresponding string set before. Like this:

<DataGrid x:Name="DonneesBrutes" IsReadOnly="True" ItemsSource="{Binding Path=result}" Margin="10,65,0,0" AutoGenerateColumns="False" EnableRowVirtualization="True" RowDetailsVisibilityMode="VisibleWhenSelected">
            <DataGrid.Columns>
                <DataGridTextColumn x:Name="PrisEnCompte" Binding="{Binding Path=Flag}" Header="Pris En Compte"></DataGridTextColumn>
                <DataGridTextColumn x:Name="PMRQ" Width="*" Binding="{Binding Path=Pmid}" Header="PMID"></DataGridTextColumn>
                <DataGridTextColumn x:Name="Ligne" Width="40" Binding="{Binding Path=Ligne}" Header="Ligne" IsReadOnly="True"></DataGridTextColumn>
                <DataGridTextColumn x:Name="LibellePMRQ" Width="*" Binding="{Binding Path=LibellePmrq}" Header="Libellé PMRQ"></DataGridTextColumn>
                <DataGridTextColumn x:Name="OTM" Width="*" Binding="{Binding Path=Otm}" Header="OTM"></DataGridTextColumn>
                <DataGridTextColumn x:Name="TOTM" Width="50" Binding="{Binding Path=Totm}" Header="TOTM"></DataGridTextColumn>
                <DataGridTextColumn x:Name="LibelleTOTM" Width="*" Binding="{Binding Path=LibelleTotm}" Header="Libellé OTM"></DataGridTextColumn>
                <DataGridTextColumn x:Name="GA" Width="70" Binding="{Binding Path=GroupeAlerte}" Header="GA"></DataGridTextColumn>
                <DataGridTextColumn x:Name="Discipline" Width="120" Binding="{Binding Path=Discipline}" Header="Discipline"></DataGridTextColumn>
                <DataGridTextColumn x:Name="DisciplineSubstituee" Width="120" Binding="{Binding Path=DisciplineSubstituee}" Header="Discipline Substituée"></DataGridTextColumn>
                <DataGridTextColumn x:Name="Remarque" Width="*" Binding="{Binding Path=.Remarque}" Header="Remarque"></DataGridTextColumn>

            </DataGrid.Columns>
        </DataGrid>

I of course define <Window.DataContext> <local:Stockage/> </Window.DataContext> before, I precise I'm using the class Stockage, the class containing my ObservableCollection of ObservableCollections, result.

The problem, on the ItemsSource="{Binding Path=result}" of my DataGrid, result 'Cannot resolve property in data context of type "WpfApplication3.Stockage` (my namespace.MyClassContainingMyCollectionResult)

I suppose I call something wrong, Or I do something forbidden. I have tried to give as much informations as possible about what is result, where I call it, how. Hope I gave enough informations and I wasn't too vaguely. I can edit my code if something missing.

Thanks for your help, and Congrats for having read this to the end.

Greetings.

EDIT1 The OnPropertyChanged is blinked, moreover, I have modified the declaration of result.

回答1:

According to you, you have set your Window.DataContext to an instance of your Stockage class:

<Window.DataContext>
    <local:Stockage/>
</Window.DataContext>

Then you are trying to data bind to a non public variable from that class, result, which you cannot do. Instead, you must make that variable a public property, which you can data bind to.

Additionally, it doesn't appear that you are actually calling your OnPropertyChanged method, which means that you haven't implemented the INotifyPropertyChanged interface correctly.



回答2:

Your problem is that result is a local variable in the method Load, and not a property you can bind to.