UWP Master / Details进入MasterMenuItem

时间:2018-08-27 10:43:26

标签: c# uwp master-detail windows-community-toolkit

加载详细信息页面后,我一直试图访问MasterMenuItem属性,但是我总是收到错误消息,即MasterMenuItem为空。 我想要做的是在MasterPage中选择一个项目后,我想要获取该项目的ID以从数据库中加载地址。这是我的代码:

我要填写的“详细信息”页面中的

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事件,但是没有运气。奇怪的是,其他一切都很好。例如,当我尝试用按钮填充地址时,它可以工作。

我在官方文档中找不到有关它的任何信息。

我的问题是我应该在哪种情况下运行代码来填写地址列表,或者该如何处理?

编辑

这是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社区工具包的一部分。

1 个答案:

答案 0 :(得分:0)

好吧,经过一段时间和不眠之夜,我终于提出了解决方案。整个笑话是在 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值,第二次是使用选定的Client),所以我必须实现 if(Property!= null),所以它只能在有实际上是一些数据,但是它就像一个魅力。

谢谢大家的帮助!