У меня есть класс Stockage, который наследует INotifyPropertyChanged. этот класс устанавливает несколько строк, а затем создает ObservableCollection из ObservableCollections. Эта 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));
}
}**
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));
}
}
Я хочу отправить ObservableCollection из ObservableCollections (result
) в 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>
Я, конечно, определяю
раньше, я точно использую класс Stockage, класс, содержащий мою ObservableCollection из ObservableCollections, result
.
Проблема в ItemsSource="{Binding Path=result}"
моей DataGrid, результат "Невозможно разрешить свойство в контексте данных типа" WpfApplication3.Stockage "(мое пространство имен.MyClassContainMyCollectionResult)
Полагаю, я что-то не так называю или делаю что-то запрещенное. Я постарался дать как можно больше информации о том, каков результат, где я его называю и как. Надеюсь, я дал достаточно информации, и я не был слишком расплывчатым. Я могу отредактировать свой код, если чего-то не хватает.
Спасибо за вашу помощь и поздравляю, что дочитали это до конца.
Приветствую.
EDIT1 OnPropertyChanged мигает, кроме того, я изменил объявление результата.
2 ответа
По вашему мнению, вы установили свой Window.DataContext
как экземпляр вашего класса Stockage
:
<Window.DataContext>
<local:Stockage/>
</Window.DataContext>
Затем вы пытаетесь привязать данные к непубличной переменной из этого класса, result
, что вы не можете сделать. Вместо этого вы должны сделать эту переменную общедоступным свойством, к которому вы можете привязать данные.
Кроме того, похоже, что вы на самом деле не вызываете свой метод OnPropertyChanged
, что означает, что вы неправильно реализовали интерфейс INotifyPropertyChanged
.
Ваша проблема в том, что result
- это локальная переменная в методе Load
, а не свойство, к которому вы можете привязаться.
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.
public static ObservableCollection<Stockage> result = new ObservableCollection<Stockage>();
непосредственно передpublic static ObservableCollection<Stockage> Load
Кроме того, у меня есть `общественное событие PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged (строковое свойство) { if (PropertyChanged! = null) { PropertyChanged (это, новое свойство PropertyChangedEventArgs (свойство)); } }` после возврата результата я редактирую свой код, кажется, я забыл его написать.ItemsSource="{Binding Path=result}"
Ожидаетсяresult
Должен ли я делатьresult.Something
? Я могу создать другую тему, если вы предпочитаете с этой новой проблемой.