【问题标题】:UWP Master/Details accessing MasterMenuItemUWP Master/Details 访问 MasterMenuItem
【发布时间】:2019-02-01 21:19:03
【问题描述】:

加载详细信息页面后,我一直在尝试访问 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 社区工具包的一部分。

【问题讨论】:

  • 嗨,这是MasterMenuItemProperty
  • 您将 MasterMenuItem 绑定到哪里?您在MasterDetailsView 上有一个SelectionChanged 事件。为什么不使用它来获取选定的项目?
  • @Stefan 查看我编辑的问题
  • @AVK 我会调查一下,谢谢

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


【解决方案1】:

好的,经过一段时间和不眠之夜,我终于找到了解决方案。整个笑话在于 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) 所以它只会在有实际上是一些数据,但它就像一个魅力。

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 2012-02-20
    • 2011-01-16
    • 1970-01-01
    • 2015-09-28
    相关资源
    最近更新 更多