Причина, по которой он не сработал, когда вы помещаете его в конструктор, заключается в том, что в данный момент в поле customers
еще нет никакого значения.
Вы получите значение только при срабатывании MainPage_Loaded
, что не произойдет из-за следующей строки в вашем XAML:
Loaded="UserControl_Loaded"
Это выполнит UserControl_Loaded
, а не MainPage_Loaded
. Что вы можете сделать, это позвонить MainPage_Loaded
с UserControl_Loaded
, что, вероятно, не то, что вы намереваетесь сделать Так что в этом случае вы должны изменить свой XAML вместо:
Loaded="MainPage_Loaded"
И вы можете полностью удалить UserControl_Loaded
, поскольку вы больше его не используете.
А что касается назначения результата в DataGrid, вы можете сделать это непосредственно, присваивая результат прямо DataContext
вместо того, чтобы проходить через свойство Customers
.
Но если вы настаиваете на присвоении его свойству Customers
и соответственно обновляете DataGrid, то следующим самым простым решением будет включение следующей строки где-нибудь в ваш Customers
метод set:
DataContext = value;
Если вы действительно настаиваете на том, чтобы DataGrid обновлялся сам по себе, когда запускается событие PropertyChanged
, без необходимости кодировать строку DataContext = Customers
, тогда вам нужно связать данные. Привязав свойство DataContext
к вашему свойству Customers
, DataGrid будет обновляться при получении события PropertyChanged
.
Чтобы объявить привязку данных в XAML, вам нужно будет присвоить имя вашему тегу UserControl
. Затем вы должны назначить привязку для DataContext
, что-то вроде этой строки:
DataContext="{Binding Path=Customers, ElementName=theUserControlName}"
И если бы я был вами, вместо того, чтобы реализовывать интерфейс INotifyPropertyChanged
, я бы вместо этого использовал Свойства зависимости . Преобразовав ваш пример для использования свойства зависимости, я бы получил:
public static DependencyProperty CustomersProperty =
DependencyProperty.Register("Customers", typeof(ObservableCollection<Customer>), typeof(MainPage), null);
public ObservableCollection<Customer> Customers
{
get { return (ObservableCollection<Customer>) GetValue(CustomersProperty); }
set { SetValue(CustomersProperty, value); }
}
Просто уведомление об изменении свойства будет обработано платформой.