UWP Master / Доступ к деталям MasterMenuItem - PullRequest
0 голосов
/ 27 августа 2018

Я пытался получить доступ к свойству MasterMenuItem после загрузки страницы сведений, но всегда получаю сообщение об ошибке, что MasterMenuItem пуст. То, что я пытаюсь сделать, это после выбора элемента в MasterPage, я хочу получить идентификатор элемента для загрузки адресов из базы данных. Вот мой код:

ListView на странице сведений, которую я пытаюсь заполнить

<ListView x:Name="MainAddressListView"
          ItemsSource="{x:Bind MainAddressCollection}"/>

Код моей страницы сведений

public ObservableCollection<Address> MainAddressCollection { get; private set; } = new ObservableCollection<Address>(); 

public Client MasterMenuItem
{
    get { return GetValue(MasterMenuItemProperty) as Client; }
    set { SetValue(MasterMenuItemProperty, value); }
}

public ClientViewDetailControl()
{
    this.InitializeComponent();
    LoadAddresses();
}

private async void LoadAddresses()
{
    MainAddressCollection.Clear();

    var data = await AddressDataService.GetAddressesDataAsync();

    foreach (var address in data)
    {
        if (MasterMenuItem.Id == address.ClientId && address.ActiveStatus == 1) //This throws me an error that MasterMenuItem is null
        {
            if (address.IsPrimary)
                    MainAddressCollection.Add(address);
                else
                    OtherAddressesCollection.Add(address);
         }
    }
}

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

Я не смог найти никакой информации об этом в официальной документации.

У меня вопрос, в каком случае мне следует запускать код для заполнения моего списка адресов или как мне подойти к этому?

EDIT

Вот дополнение к MasterMenuItemProperty:

public static readonly DependencyProperty MasterMenuItemProperty = DependencyProperty.Register("MasterMenuItem", typeof(Client), typeof(ClientViewDetailControl), new PropertyMetadata(null, OnMasterMenuItemPropertyChanged));

private static void OnMasterMenuItemPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var control = d as ClientViewDetailControl;
    control.ForegroundElement.ChangeView(0, 0, 1);
}

MasterMenuItem передается из MasterView в представление Details как целый объект, который я могу затем использовать по своему усмотрению. Пример связывания в XAML у меня есть (и работает как надо):

<TextBlock  Text="{x:Bind MasterMenuItem.ShortName, Mode=OneWay}"

Для записи - я использую шаблон "MasterDetailsView" , который является частью Windows Community Toolkit.

1 Ответ

0 голосов
/ 06 сентября 2018

Хорошо, после некоторого времени и бессонных ночей я наконец пришел с решением. Вся шутка заключалась в определении свойства MasterMenuItem и способа его заполнения (что довольно сложно).

В основном, первое, что пытается сделать программа, - это заполнить свойство MasterMenuItem (что происходит после выбора элемента в MasterView), но в итоге оно становится равным null . После этого он просматривает код и несколько страниц, после чего снова попадает в свойство MasterMenuItem - только теперь с фактическими данными о выбранном элементе. А поскольку все события, вызываемые в DetailsView, запускаются только после первой попытки заполнить MasterMenuItem некоторыми данными, это никогда не сработало.

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

Оригинальная реализация MasterMenuItem

public Client MasterMenuItem
    {
        get { return GetValue(MasterMenuItemProperty) as Client; }
        set { SetValue(MasterMenuItemProperty, value); }                
    }

Отредактированная реализация MasterMenuItem

public Client MasterMenuItem
    {
        get {
            Client Property = GetValue(MasterMenuItemProperty) as Client;
            if (Property != null)
                LoadAddresses(Property.Id);
            return Property as Client;
        }
        set { SetValue(MasterMenuItemProperty, value); }                
    }

Поскольку эта часть кода вызывается дважды (сначала со значением Null, затем с выбранным клиентом), мне пришлось реализовать if (Property! = Null) , чтобы он выполнялся только при наличии некоторые данные, но это работает как шарм.

Спасибо всем за помощь!

...