Pau*_*aul 8 xamarin xamarin.forms
我在Master-Detail页面上按照教程进行操作
我有一个问题:
部分解决方案需要一个项目类,如下所示:
public class MasterPageItem
{
public string Title { get; set; }
public string IconSource { get; set; }
public Type TargetType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在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>
Run Code Online (Sandbox Code Playgroud)
我想要做的是"文件4",而不是创建一个视图,我宁愿发送一个字符串,(或更好的枚举),所以我可以调用不同的函数.示例:打开网页,注销等.如何修改TargetType?
如果您注意到这段代码,您将看到该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;
}
}
Run Code Online (Sandbox Code Playgroud)
它直接通过事件处理程序进行导航(这不是MVVM这样做的方式).
例如,您可以创建自己的模型来替换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 */
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
* - 假设您已正确进行绑定
这不是一个完整的实现,但我希望你已经找到了它的一般概念.
让我知道我是否可以帮助你通过这个(对任何英语错误抱歉,这里不是本地人).
| 归档时间: |
|
| 查看次数: |
183 次 |
| 最近记录: |