#c# #.net #wpf #c#-4.0 #.net-4.0
#c# #.net #wpf #c #-4.0 #.net-4.0
Вопрос:
Надеюсь, я смогу прояснить это. У меня есть DataGrid
<DataGrid Grid.Row="6" Grid.Column="1"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
ItemsSource="{Binding projectEntriesForEmployee}">
привязан к
public ObservableCollection<ProjectEntry> projectEntriesForEmployee {
get { return (ObservableCollection<ProjectEntry>)GetValue(projectEntriesForEmployeeProperty); }
set { SetValue(projectEntriesForEmployeeProperty, value); }
}
public DependencyProperty projectEntriesForEmployeeProperty = DependencyProperty.Register("projectEntriesForEmployee", typeof(ObservableCollection<ProjectEntry>), typeof(MainWindowVC));
Если я установлю projectEntriesForEmployee перед загрузкой моего UserControl (что я сделал для отладки), мои строки будут отображаться в DataGrid правильно. Однако, если projectEntriesForEmployee имеет значение null при загрузке UserControl, когда я устанавливаю projectEntriesForEmployee в допустимую ObservableCollection с элементами в списке (на основе события), в DataGrid не отображаются строки. Что может происходить?
Редактировать: я пытался
CollectionViewSource.GetDefaultView(projectEntriesForEmployee).Refresh();
но никакой радости.
Ответ №1:
Я не уверен, что происходит, но я бы попробовал использовать Snoop для детализации в DataGrid и убедиться, что после обновления projectEntriesForEmployeeProperty
для DataContext
DataGrid
элемента ItemsSource
по-прежнему установлен соответствующий объект, и проверить привязку к,,. Если есть какие-либо ошибки привязки, Snoop покажет их, а также позволит вам перейти к объекту и увидеть полное выражение привязки. Просто предложение.
Комментарии:
1. Я также проверю Snoop. Мне нужно что-то, что поможет мне увидеть, что происходит с привязками XAML и т.д. Спасибо за предложение.
Ответ №2:
При загрузке вашего элемента управления и ваша операционная система, и ItemsSource вашей DataGrid указывают на одно и то же: нулевую часть памяти.
Некоторое время спустя вы инициализируете свою операционную систему в коллекцию. Теперь ваша операционная система содержит коллекцию, но ItemSource вашей DataGrid по-прежнему указывает на ту же пустую часть памяти.
Разве вы не можете просто инициализировать свой OC в конструкторе вашего элемента управления?
Редактировать
Я не гуру WPF, поэтому для этого может быть причина, но почему вы устанавливаете свою ObservableCollection как свойство dependency? Если все, что вы делаете, это привязываете их к ItemsSource вашей DataGrid, обычное ванильное свойство C # будет работать нормально и по-прежнему предоставлять вам все автоматические обновления, которые происходят при добавлении в коллекцию или удалении из нее.
Комментарии:
1. Я не могу инициализировать его в конструкторе, но тот факт, что они не указывают на одну и ту же память, кажется, является проблемой. Я думал, что привязка по существу укажет datagrid и OC на одну и ту же память; очевидно, что нет. Я сбрасываю свойство ItemsSource datagrid в моем классе контроллера после получения OC и вуаля, у меня есть строки в моей datagrid. Спасибо!
2. Повторите мой предыдущий комментарий, я только что понял, насколько это глупо. Очевидно, что если OC имеет значение null, оно никуда не указывает! О!
3. Нет четкого способа объяснить, почему они не указывают на одно и то же место в памяти после инициализации операционной системы. В программировании этому учат, представляя, что когда вы говорите ItemsSource={Binding X} и стрелка выводится из ItemsSource вашей сетки в то же место в памяти, на которое указывает X. Теперь X и источник элементов вашей сетки указывают на одно и то же место. Позже, когда вы скажете X = new …(); все, что вы сделали, это изменили стрелку X, чтобы указать новое место. ItemsSource вашей сетки по-прежнему указывает на то же место. Я надеюсь, это понятно.
4. Но реальный вопрос в том, почему вы не можете выполнить инициализацию в своем конструкторе. Как я упоминал в своем ответе, вы, вероятно, можете полностью отключить свое свойство dependency и просто использовать свойство POCO. Если все, что вы делаете, это привязка к ItemsSource, это будет работать так же хорошо
5. ObservableCollection уведомит систему привязки, когда он будет добавлен или удален, но он не будет уведомлять систему, когда он будет изменен с null или на совершенно другой объект OC. Так вот почему ему нужно, чтобы это было свойство DependencyProperty (или, по крайней мере, должно быть реализовано INPC).
Ответ №3:
Извините всех. Я ответил на свой собственный вопрос, поскольку оказывается, что проблема заключалась в типе владельца свойства зависимости. У меня это было как MainWindowVC. Это должен был быть TimeEntryVC. Как только я это изменил, я прокомментировал сброс ItemsSource в классе Controller, и все заработало так, как должно. Итак, @Tim, ты прав, что система привязки позаботится обо всем; Я просто сказал ей искать свойство не в том классе. Несмотря ни на что, спасибо всем, поскольку сейчас я лучше понимаю, что происходит за кулисами, чем раньше.