У меня есть класс 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 /> раньше, я точно использую класс Stockage, класс, содержащий мою ObservableCollection из ObservableCollections, result.

Проблема в ItemsSource="{Binding Path=result}" моей DataGrid, результат "Невозможно разрешить свойство в контексте данных типа" WpfApplication3.Stockage "(мое пространство имен.MyClassContainMyCollectionResult)

Полагаю, я что-то не так называю или делаю что-то запрещенное. Я постарался дать как можно больше информации о том, каков результат, где я его называю и как. Надеюсь, я дал достаточно информации, и я не был слишком расплывчатым. Я могу отредактировать свой код, если чего-то не хватает.

Спасибо за вашу помощь и поздравляю, что дочитали это до конца.

Приветствую.

EDIT1 OnPropertyChanged мигает, кроме того, я изменил объявление результата.

0
Flo 23 Сен 2014 в 11:17

2 ответа

Лучший ответ

По вашему мнению, вы установили свой Window.DataContext как экземпляр вашего класса Stockage:

<Window.DataContext>
    <local:Stockage/>
</Window.DataContext>

Затем вы пытаетесь привязать данные к непубличной переменной из этого класса, result, что вы не можете сделать. Вместо этого вы должны сделать эту переменную общедоступным свойством, к которому вы можете привязать данные.

Кроме того, похоже, что вы на самом деле не вызываете свой метод OnPropertyChanged, что означает, что вы неправильно реализовали интерфейс INotifyPropertyChanged.

0
Sheridan 23 Сен 2014 в 12:02
Во-первых, я объявил такой результат: public static ObservableCollection<Stockage> result = new ObservableCollection<Stockage>(); непосредственно перед public static ObservableCollection<Stockage> Load Кроме того, у меня есть `общественное событие PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged (строковое свойство) { if (PropertyChanged! = null) { PropertyChanged (это, новое свойство PropertyChangedEventArgs (свойство)); } }` после возврата результата я редактирую свой код, кажется, я забыл его написать.
 – 
Flo
23 Сен 2014 в 12:12
Хорошо, теперь у меня другая ошибка в свойстве ItemsSource="{Binding Path=result}" Ожидается result Должен ли я делать result.Something? Я могу создать другую тему, если вы предпочитаете с этой новой проблемой.
 – 
Flo
23 Сен 2014 в 12:34
Я могу создать другую тему, если вы предпочитаете эту новую проблему... возможно, это лучше, так как этот вопрос становится очень запутанным теперь, когда вы изменили свой код и сделали эти два ответа странными. Пожалуйста, включите полную информацию об ошибке в свой новый вопрос.
 – 
Sheridan
23 Сен 2014 в 12:38

Ваша проблема в том, что result - это локальная переменная в методе Load, а не свойство, к которому вы можете привязаться.

0
Roel van Westerop 23 Сен 2014 в 12:00