加载详细信息页面后,我一直试图访问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 Community Toolkit的一部分。
最佳答案
好的,经过一段时间和不眠之夜,我终于提出了解决方案。整个笑话都是在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),因此它仅在实际有一些数据时才运行,但它就像一个魅力。
谢谢大家的帮助!
关于c# - UWP Master/Details访问MasterMenuItem,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52037556/