gpt4 book ai didi

xamarin - MasterDetailPage : Accepting something other than a Page

转载 作者:行者123 更新时间:2023-12-04 08:02:26 25 4
gpt4 key购买 nike

我正在关注 Master-Detail Page 上的教程

我有一个问题:

部分解决方案需要一个项目类,如下所示:

public class MasterPageItem
{
public string Title { get; set; }
public string IconSource { get; set; }
public Type TargetType { get; set; }
}

在 Xaml 文件中,您可以这样称呼它:

   <ListView.ItemsSource>
<x:Array Type="{x:Type local:MasterPageItem}">
<local:MasterPageItem Title="Radio" IconSource="hamburger.png" TargetType="{x:Type local:RadioPage}" />

<local:MasterPageItem Title="Item 1" TargetType="{x:Type temp:ContactsPage}" />
<local:MasterPageItem Title="Item 2" TargetType="{x:Type temp:TodoListPage}" />
<local:MasterPageItem Title="Item 3" TargetType="{x:Type temp:ReminderPage}" />
<local:MasterPageItem Title="File 4" TargetType="{}Foodaddy" />
</x:Array>
</ListView.ItemsSource>

我想做的是“文件4”,而不是创建一个 View ,我宁愿发送一个字符串,(或者更好的是一个枚举),所以我可以调用不同的函数。示例:打开网页、注销等。如何修改 TargetType?

最佳答案

If you notice in this piece of code你会看到 OnItemSelected方法正在处理事件并期待 MasterPageItem :

void OnItemSelected (object sender, SelectedItemChangedEventArgs e)
{
var item = e.SelectedItem as MasterPageItem;
if (item != null) {
Detail = new NavigationPage ((Page)Activator.CreateInstance (item.TargetType));
masterPage.ListView.SelectedItem = null;
IsPresented = false;
}
}

它直接通过事件处理程序进行导航(这不是 MVVM 的方式)。

我猜 @Jasonadvice适合你。这是实现这一目标的一种方法:

您可以创建自己的模型来替换 MasterPageItem并在 MasterDetailMenuViewModel 中处理其属性,例如,并根据您的需要将处理修改为更准确的内容。

请参见下面的示例:

为您的菜单项创建一个惊人的模型

public class AmazingMenuItem
{
public string ItemName { get; set; }
public string ItemIconSource { get; set; }
public EnumAction ActionType { get; set; }
public object ActionParameter { get; set; }
}

public enum EnumAction
{
OpenPage = 0,
ShowMessage = 1,
PopToRoot = 2
/* ... and so on */
}

在 View 模型中处理它*

public class MenuViewModel : SomeINotifyPropertyChangedImplementation
{
public Command ItemSelectedCommand { get; }
/*
Other properties
*/

public MenuViewModel()
{
ItemSelectedCommand = new Command<AmazingMenuItem>(ExecuteItemSelected);
}

private void ExecuteItemSelected(AmazingMenuItem item)
{
if(item != null)
{
switch(item.ActionType)
{
case EnumAction.OpenPage:
var detail = (App.Current.MainPage as MasterDetailPage).Detail;

if(detail is NavigationPage)
detail.PushAsync((Page)Activator.CreateInstance(item.ActionParameter.GetType()));
else
(App.Current.MainPage as MasterDetailPage).Detail = new NavigationPage((Page)Activator.CreateInstance(item.ActionParameter.GetType()));

break;
case EnumAction.ShowMessage:
App.Current.MainPage.DisplayAlert(item.ActionParameter.ToString(), "Ok", "Cancel");

break;
case EnumAction.PopToRoot:
(App.Current.MainPage as MasterDetailPage)?.Detail.PopToRootAsync();

break;

}
}
}
}

* - 假设您已正确进行绑定(bind)

这不是一个完整的实现,但我希望您已经了解了它的一般概念。

让我知道我是否可以帮助您解决这个问题(对于任何英语错误,我们深表歉意,这里不是本地人)。

关于xamarin - MasterDetailPage : Accepting something other than a Page,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50570803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com