Режим привязки = TwoWay работает только по «одностороннему» пути

1

Я привязываю данные от DbSet к DataGrid благодаря наблюдаемой коллекции. Способ DbSet => DataGrid работает хорошо, но способ DataGrid => DbSet совсем не работает.

Это некоторые коды, чтобы показать вам, что я сделал:

Прежде всего, Datagrid со свойствами Binding:

<DataGrid x:Name="DonneesBrutes" ItemsSource="{Binding Path=.ResultatCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="10,65,0,0" AutoGenerateColumns="False" EnableRowVirtualization="True" RowDetailsVisibilityMode="VisibleWhenSelected">
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="PMRQ" Width="*" Binding="{Binding Path=.TOTMPMRQ, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="PMRQ"></DataGridTextColumn>
        <DataGridTextColumn x:Name="LibellePMRQ" Width="*" Binding="{Binding Path=.LibelléTOTApres, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="Libellé PMRQ"></DataGridTextColumn>
        <DataGridTextColumn x:Name="Ligne" Width="*" Binding="{Binding Path=.Remarque, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="Ligne"></DataGridTextColumn>
        <DataGridTextColumn x:Name="OTM" Width="*" Binding="{Binding Path=.TOTMPMRQ, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="OTM"></DataGridTextColumn>
        <DataGridTextColumn x:Name="TOTM" Width="*" Binding="{Binding Path=.SiModifie, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="TOTM"></DataGridTextColumn>
        <DataGridTextColumn x:Name="LibelleTOTM" Width="*" Binding="{Binding Path=.LibelléTOTApres, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="Libellé OTM"></DataGridTextColumn>
        <DataGridTextColumn x:Name="GA" Width="*" Binding="{Binding Path=.Groupe_D_alerte, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="GA"></DataGridTextColumn>
        <DataGridTextColumn x:Name="Discipline" Width="*" Binding="{Binding Path=.NomTable, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="Discipline"></DataGridTextColumn>
        <DataGridTextColumn x:Name="DisciplineSubstituee" Width="120" Binding="{Binding Path=.NomChamp, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="Discipline Substituée"></DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

Это ResultatCollection, который является ObservableCollection, который я сделал для привязки данных DbSet к DataGrid:

class ViewModel:INotifyPropertyChanged
{
    private BDDInterneEntities _BDDInterneEntities;

    public ViewModel()
    {
        _BDDInterneEntities = new BDDInterneEntities();
        ResultatCollection = new ObservableCollection<Resultat>(_BDDInterneEntities.Resultat);
    }         
    public ObservableCollection<Resultat> ResultatCollection { get; set; }


    public event PropertyChangedEventHandler PropertyChanged;

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

    }
}

И вот тогда выглядит DbSet Resultat:

public partial class Resultat:INotifyPropertyChanged
{
    public string NomTable { get; set; }
    public string Groupe_D_alerte { get; set; }
    public string NomChamp { get; set; }
    public string TOTMPMRQ { get; set; }
    public string SiModifie { get; set; }
    public string LibelléTOTAvant { get; set; }
    public string LibelléTOTApres { get; set; }
    public string Remarque { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;

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

    }
}

Я слышал о DataGrid.Items.refresh(), но он звучит не работает, DataGrid.ItemsSource = null, а затем DataGrid.ItemsSource = myDataSource, но он не слишком.

Я тоже слышал, что режима = TwoWay и UpdateSourceTrigger = PropertyChanges было достаточно, я совсем потерялся.

Заранее спасибо за помощь.

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

  • 5
    Это ваша реальная реализация Resultat ? Если это так, то вы только технически реализовали INotifyPropertyChanged но проигнорировали, чтобы фактически вызвать событие, если эти свойства изменятся. (То же самое относится и к ViewModel )
  • 0
    Да, это фактическая реализация Resultat . Вы имеете в виду, что я реализовал INotifyPropertyChanged, но я не определил, что он должен делать, это правильно?
Теги:
xaml
wpf
datagrid

1 ответ

2
Лучший ответ

Чтобы получать обязательные уведомления, вы должны правильно выполнить INotifyPropertyChanged. То, как вы это сделали, сделало его компилируемым, но не намного больше.

Каждый раз, когда изменяется внешнее видимое свойство, вы должны поднять событие PropertyChanged. Вот почему вы обычно видите код как

private int myProperty;

public int MyProperty
{
    get { return myProperty; }
    set
    {
        if (myProperty != value)
        {
            myProperty = value;
            OnPropertyChanged("MyProperty");
        }
    }
}

Конечно, вы не должны писать прямо в поле, но вместо этого используйте свойство, если хотите уведомить пользователей этого класса об изменениях свойств.


Как вы видите, это становится довольно утомительным, поэтому некоторые рамки MVVM предлагают упрощенные версии, но вы также можете сделать свою собственную версию, например

protected void Set<T>(ref T field, T newValue, string propertyName)
{
    if (field != newValue)
    {
        field = newValue;
        OnPropertyChanged(propertyName);
    }
}

Тогда ваше имущество станет

public int MyProperty
{
    get { return myProperty; }
    set { Set(ref myProperty, value, "MyProperty"); }
}
  • 0
    Спасибо за ваш ответ, я ассимилирую то, что вы мне сказали, и адаптирую это к моему коду. Если это сработает, я приму ответ.
  • 0
    У меня есть первый вопрос, который возникает, я чувствую, что цикл if предназначен только для одного свойства. Должен ли я делать цикл для каждой строки Resultat или я ошибаюсь?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню