绑定路径= myObservableCollection属性预期 [英] Binding Path=myObservableCollection Property Expected

查看:166
本文介绍了绑定路径= myObservableCollection属性预期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个名为Stockage的类继承了INotifyPropertyChanged。这个类设置一些字符串,然后创建一个ObservableCollection的ObservableCollection。这个ObservableCollection将值发送到之前设置的几个字符串。



像这样:

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

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.F irstOrDefault(e => resultat.TOTMPMRQ == e.TOTMPMRQ).TOTMPMRQ.Substring(10,8),
Totm = listResult.FirstOrDefault(e => resultat.TOTMPMRQ == e.TOTMPMRQ).TOTMPMRQ .bstr(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,
});


}
返回结果;
}


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

OnPropertyChanged方法称为



ObservableCollections在另一个名为ViewModel的类中设置,并继承了INotifyPropertyChanged:

  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;组; }
public ObservableCollection< D98Equipements> D98EquipementsCollection {get;组; }
public ObservableCollection< D98Details> D98DetailsCollection {get;组; }
public ObservableCollection< D675> D675Collection {get;组; }
public ObservableCollection< Activite> ActiviteCollection {get;组; }


public event PropertyChangedEventHandler PropertyChanged;

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

}

我想发送ObservableCollection ObservableCollections(result)到DataGrid,所以我将DataGrid绑定到集合,然后我绑定每个DataGridTextColumn与之前的对应的字符串。像这样:

 < DataGrid x:Name =DonneesBrutesIsReadOnly =TrueItemsSource ={Binding Path = result }Margin =10,65,0,0AutoGenerateColumns =FalseEnableRowVirtualization =TrueRowDetailsVisibilityMode =VisibleWhenSelected> 
< DataGrid.Columns>
< DataGridTextColumn x:Name =PrisEnCompteBinding ={Binding Path = Flag}Header =Pris En Compte>< / DataGridTextColumn>
< DataGridTextColumn x:Name =PMRQWidth =*Binding ={Binding Path = Pmid}Header =PMID>< / DataGridTextColumn>
< DataGridTextColumn x:Name =LigneWidth =40Binding ={Binding Path = Ligne}Header =LigneIsReadOnly =True>< / DataGridTextColumn>
< DataGridTextColumn x:Name =LibellePMRQWidth =*Binding ={Binding Path = LibellePmrq}Header =LibelléPMRQ>< / DataGridTextColumn>
< DataGridTextColumn x:Name =OTMWidth =*Binding ={Binding Path = Otm}Header =OTM>< / DataGridTextColumn>
< DataGridTextColumn x:Name =TOTMWidth =50Binding ={Binding Path = Totm}Header =TOTM>< / DataGridTextColumn>
< DataGridTextColumn x:Name =LibelleTOTMWidth =*Binding ={Binding Path = LibelleTotm}Header =LibelléOTM>< / DataGridTextColumn>
< DataGridTextColumn x:Name =GAWidth =70Binding ={Binding Path = GroupeAlerte}Header =GA>< / DataGridTextColumn>
< DataGridTextColumn x:Name =DisciplineWidth =120Binding ={Binding Path = Discipline}Header =Discipline>< / DataGridTextColumn>
< DataGridTextColumn x:Name =DisciplineSubstitueeWidth =120Binding ={Binding Path = DisciplineSubstituee}Header =DisciplineSubstituée>< / DataGridTextColumn>
< DataGridTextColumn x:Name =RemarqueWidth =*Binding ={Binding Path = .Remarque}Header =Remarque>< / DataGridTextColumn>

< /DataGrid.Columns>
< / DataGrid>

我定义< Window.DataContext>
< local:Stockage />
< /Window.DataContext>
以前,我精确地使用了类库,这个类包含ObservableCollection的ObservableCollections结果。



在我的DataGrid 结果 ItemsSource ={Binding Path = result} 带来预期财产信息,不要提供任何其他信息。



如果我尝试在结果之后添加,建议计数 this [int]



我知道这个主题对我的其他主题看起来很多,无法在'namespace.class类型的数据上下文中解析属性'myObservableCollection' ,以下是第一个。



希望我提供足够的信息,并不太模糊。感谢您的帮助。



问候。

解决方案

您的 Stockage 类有成员 result ,但它不是一个 public 属性应该是:

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

这是一个 public static em> not 属性。应该这样定义:

  private ObservableCollection< Stockage> result = new ObservableCollection< Stockage>(); 
public ObservableCollection< Stockage>结果
{
get {return result; }
set {result = value; OnPropertyChanged(Result);注意如何调用$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ code>方法报告属性更改...您的属性的所有应该这样做... INotifyPropertyChange 界面。


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.

解决方案

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.

这篇关于绑定路径= myObservableCollection属性预期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆