Binding Path=myObservableCollection Property Expected

╄→尐↘猪︶ㄣ 提交于 2020-01-15 09:20:29

问题


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 method OnPropertyChanged is called just above

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 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 bring the message "Property Expected" and don't give any other information..

If I try to ad a . after result, It suggest Countor this[int]

I know this subject looks like a lot to my other topic Cannot resolve property 'myObservableCollection' in data context of type ''namespace.class" , indeed, it's the following of the first one.

Hope I gave enough informations and wasn't too vaguely. I can edit my code if something missing.

Thanks for your help.

Greetings.


回答1:


Your Stockage class has the member result, but it is not a public property like it should be:

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

This is a public static variable, not a property. It should be defined like this:

private ObservableCollection<Stockage> result  = new ObservableCollection<Stockage>();
public ObservableCollection<Stockage> Result
{
    get { return result ; }
    set { result  = value; OnPropertyChanged("Result"); }
}

Note how it calls the OnPropertyChanged method to report of property changes... all of your properties should do that... that is how you implement the INotifyPropertyChange interface.



来源:https://stackoverflow.com/questions/25992004/binding-path-myobservablecollection-property-expected

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!