问题
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 Count
or 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