【问题标题】:Binding Path=myObservableCollection Property Expected绑定路径=myObservableCollection 预期属性
【发布时间】:2014-11-17 11:27:08
【问题描述】:

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

像这样:

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

上面调用了 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; 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));
        }

}

我想将 ObservableCollections(结果)的 ObservableCollection 发送到 DataGrid,因此我将 DataGrid 绑定到集合,然后将每个 DataGridTextColumn 与之前设置的相应字符串绑定。像这样:

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

我之前定义了<Window.DataContext> <local:Stockage/> </Window.DataContext>,我准确地说我正在使用Stockage 类,该类包含我的ObservableCollection 的ObservableCollection 结果。

问题,在我的 DataGrid 的 ItemsSource="{Binding Path=result}" 上,result 带上消息“Property Expected”,不要提供任何其他信息..

如果我尝试在结果后添加.,则建议Count或this[int]

我知道这个主题与我的其他主题 Cannot resolve property 'myObservableCollection' in data context of type ''namespace.class" 很像,事实上,它是第一个主题的后续。

希望我提供了足够的信息并且不要太含糊。如果缺少某些内容,我可以编辑我的代码。

感谢您的帮助。

您好。

【问题讨论】:

  • 嗨,什么是“结果”,我在您的 ViewModel 上找不到。它是一个属性还是实际上是一个变量?如果是后者,那就是你的问题。顺便说一句,我看到你的 Stockage 类中有很多属性,只有 getter 和 setter,不会调用 PropertyChanged。如果这些属性中的任何一个发生更改,则对于绑定到这些属性的任何内容,GUI 都不会更新。

标签: c# wpf data-binding properties datagrid


【解决方案1】:

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

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

这是一个public static 变量,不是一个属性。应该这样定义:

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

注意它如何调用OnPropertyChanged 方法来报告属性更改...所有您的属性都应该这样做...那是你的方式实现INotifyPropertyChange接口。

【讨论】:

  • 哦,好吧,我明白我的错误了。我将看到有关 INotifyPropertyChanged 实现的更多信息,并使结果成为属性,而不是像我以前那样的变量。谢谢大家。
猜你喜欢
  • 2012-11-11
  • 2018-07-23
  • 2011-04-04
  • 2010-11-01
  • 2020-12-27
  • 1970-01-01
  • 2019-11-14
  • 2021-06-24
  • 1970-01-01
相关资源
最近更新 更多