0

У меня datagrid забинден sourceitems к ObservableCollection, когда я изменяю что-нибудь из коллекции, коллекция изменяется но view не показывает пока не кликну на строку. В чем проблема?

<DataGrid CanUserResizeRows="True"  
              RowHeight="32" 
              SelectionUnit="FullRow" 
              SelectionMode="Extended" 
              Grid.Row="2" Background="White" 
              ItemsSource="{Binding Configs, UpdateSourceTrigger=PropertyChanged}" 
              AutoGenerateColumns="False" 
              ColumnHeaderStyle="{DynamicResource DataGridColumnHeaderStyle}">

<DataGridTextColumn Header="Description" 
                    Binding="{Binding Path=Description, UpdateSourceTrigger=PropertyChanged}" 
                    Width="*"/>

MVVM

private ObservableCollection<Config> _configs = new ObservableCollection<Config>();
public ObservableCollection<Config> Configs
{
  get {
    return _configs;
  }
  set {
    _configs = value;
    OnPropertyChanged("Configs");
  }
}
  • Лучше дубликата не нашел (уверен, что есть), но все же, вот вам ответ. – EvgeniyZ Jul 23 '18 at 09:39
  • @EvgeniyZ не работает) пробовал уже) – Mike Waters Jul 23 '18 at 09:47
  • А написать об этом? Написать о ваших вариантах решения? В WPF есть пару видов обновления данных, стандартно стоит вроде "если потерян фокус", ибо так идет меньше нагрузки. В ответе выше сказано как поставить при изменение значения. Если у вас это не работает, значит данные как то не правильно биндятся и обновляются, или что то еще мешает. Без кода и без данных мы вам не помощники.. – EvgeniyZ Jul 23 '18 at 10:09
  • @EvgeniyZ добавил код – Mike Waters Jul 23 '18 at 10:55
  • Оно обновляет при клике на строку, а так старые данные остаються в view – Mike Waters Jul 23 '18 at 10:58
  • Во первых, вызывать OnPropertyChanged у ObservableCollection лишне, она сама имеет в себе все, что нужно для обновления. Достаточно просто public ObservableCollection<Config> Configs {get; set;} и дальше инициализация и заполнение. Во вторых DataGridTextColumn должны находиться внутри <DataGrid.Columns>, как показано у вас - он воспримет это за итем, а не за столбец. В третьих у ItemsSource делать UpdateSourceTrigger бессмысленно. Раз привязали и забыли про это. Ну и на последок, воспроизвел весь ваш пример - все обновляет сразу при написание... – EvgeniyZ Jul 23 '18 at 11:22
  • Я понял о чем вы говорите. Да, умеете вопрос задавать... Вся ваша проблема в том, что вы не понимаете как реализовывать INotifyPropertyChanged (далее INPC). Его надо реализовывать на тех свойствах, которые могут обновиться из кода во время работы программы, тем самым ваш интерфейс обновит данные. То есть ваш класс Config должен реализовывать INPC и у нужных свойств (Description в вашем случае) должно быть вызвано в set OnPropertyChanged (как сейчас у вас сделано для коллекции). – EvgeniyZ Jul 23 '18 at 11:36
  • @EvgeniyZ но правильно ли реализовывать INPC там? – Mike Waters Jul 23 '18 at 11:38
  • INPC обычно реализуют в отдельном классе и от него потом наследуются, вызвав у нужного свойства только OnPropertyChanged. Можете посмотреть этот ответ, там реализация INPC идет в отдельном классе, а StudentViewModel наследуется от него и вызывает в нужных свойствах обновление. – EvgeniyZ Jul 23 '18 at 11:41
  • @EvgeniyZ спасибо, все решилось, тоже так думал, начал везде UpdateSourceTrigger ставить) просто не уверен в том что не нарушаю MVVM – Mike Waters Jul 23 '18 at 11:44
  • 1
    Придерживайтесь двум правилам. 1. Не в коем случае вы не должны знать о View из кода, то есть не должны вызывать textBox1.Text = "111"; или что то подобное, максимум - это DataContext, далее прост идет работа с данными, коллекциями и прочим, View не трогаем!. Ну и следите за тем, что бы каждая VM/M отвечала только за свое одно что то. Скажем автобус, в автобусе люди. Вот автобус - отдельный объект, который содержит другие объекты (мотор, колеса, люди и др). Люди - это другой объект, со своими объектами и функциями. Вот с таким разграничением вы особо нечего не нарушите. – EvgeniyZ Jul 23 '18 at 11:49

0 Answers0