我遇到的一个问题是:
解决方案的一部分需要如下项目类:
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”,而不是创建视图,我宁愿发送一个字符串,(或更好的枚举),所以我可以调用不同的函数。示例:打开网页,注销等。如何修改TargetType?
答案 0 :(得分:6)
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
这样做的方式。)
我猜@Jason&#39; advice适合你。以下是实现这一目标的方法:
例如,您可以创建自己的模型来替换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 */
}
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;
}
}
}
}
* - 假设您已正确地进行了绑定
这不是一个完整的实现,但我希望你已经找到了它的一般概念。
如果我可以帮助您通过此(并对任何英语错误表示抱歉,此处不是本地人),请告诉我。