Tag: mvvmcross

带有MVVMCross的UICollectionView节

最近,有人要求我在Xamarin.iOS上的各部分中实现CollectionView。 在该项目中,我们使用了MVVMCross。 我知道可以在iOS本机上执行此操作,因此我想到了在Xamarin中执行此操作的解决方案。 不幸的是,我没有找到示例代码,所以我不得不自己弄清楚😢 在本文中,我将向您展示如何在Xamarin上实现Sectioned UICollectionView。 尽管在示例代码中,我正在使用MVVMCross处理绑定等。这并不意味着它仅适用于此框架。 跨框架一😉 出于本教程的目的,我将创建一个书籍列表。 将有几个类别,每个类别可以包含不同数量的书籍。 我们走吧! 如果您只想了解代码,请在本文结尾处找到指向Github上的示例存储库的链接。 免责声明 在我们开始之前还有另外一件事:我认为这种解决方案不是完美的解决方案。 它是基于SWIFT代码,StackOverflow答案和其他小提示构造的。 我将所有内容放在一起并制作了样本。 为了使UI更好,我添加了FFImageLoading库,以便可以显示书籍缩略图。 逐步解决方案 介绍后,让我们继续进行一些编码。 首先 ,创建您的UICollectionView并将其添加到您的视图/页面。 基本上,此步骤实际上并不重要-您只需要添加UICollectionView。 下一步(第二步),我建议您创建ItemCells和HeaderCell 。 为了创建ItemCells,您需要创建一个派生自MvxCollectionViewCell的类。 您可以通过创建XIB文件或.cs文件来实现。 填充视图,创建绑定,然后完成。 矿井看起来像这样 如您所见,我们有一个不错的CollectionView,分为几部分。 这就是我们应该达到的目标,这就是已经实现的目标! 完善! 😇 CollectionViews与FlowLayout相结合是iOS上的强大控件。 添加页眉和页脚会赋予它们额外的功能。 使用iPad或更大的iPhone屏幕时,我总是喜欢看到它们。 它们看起来比TableViews更好,它们表现良好,而且非常易于使用。 我真的希望有人会对这篇文章有所帮助。 正如我在简介中所述,在网上找不到类似的文章,所以我决定自己写一篇。 如果您发现任何错误或不清楚的地方,请随时写评论问我。 如果您觉得这篇文章有用,请给我一些爱,然后单击下面的拍手按钮。 它使我充满动力!

如何绑定NSAttributeString(或NSMutableAttributedString)

我想使用MVVMCross将一个属性string绑定到一个UILabel。 绑定一个常规string,我只是做: set.Bind(MyLabel).To(vm => vm.MyString); 但是我需要一个string,其中一部分文本将使用一种颜色和一种字体大小,而另一部分将使用不同的颜色和不同的字体大小。 如果这是静态的,没问题,我会在界面生成器中添加一个标签,并将其设置为“属性”,然后设置任何字体选项,我想要哪些部分的string我需要。 所以我想用Mvvmcross,我可能需要一个转换器将我的源string转换为一个属性的string,所以我试图创build一个转换器从MvxValueConverter<string,NSMutableAttributedString> ,只是在它的Convert方法: return new NSMutableAttributedString(value); 最终我会添加一些不同的属性。 不幸的是,这是行不通的。 如果我这样设置我的绑定: set.Bind(MyLabel).To(vm => vm.MyString).WithConversion("MyConverter"); 看来,MvvmCross只是对属性string做一个.ToString ,它显示为: Some Text {} 请注意{}不是原始string的一部分。 有没有办法在MVVMCross绑定一个属性的string?

将Google移动分析与MVVMCross整合

新的Google AnalyticsSDK为您必须inheritance的UIViewController引入了一个新的子类: GAITrackedViewController 。 更多信息: https : //developers.google.com/analytics/devguides/collection/ios/v2/screens 这显然与MvxBindingTouchViewController冲突,因为只能从C#中的一个类inheritance。 推荐的方法是什么?

MvvmCross:MvxImageViewLoader如何设置DefaultImagePath属性

我怎样才能在MvxImageViewLoader上设置DefaultImagePath? 我如何获得UImage的LocalResourcePath? var imageViewLoader = new MvxImageViewLoader(() => imageView); imageViewLoader.DefaultImagePath = UIImage.FromBundle("images/Default.png"); imageViewLoader.ErrorImagePath = UIImage.FromBundle("images/Error.png");

如何在closures视图时传回数据

我有一个ViewModel有一个打开另一个视图的命令: public ICommand OpenAnotherViewCommand { get { return new MvxCommand(() => ShowViewModel<AnotherViewModel>()); } } 到现在为止还挺好。 然后在AnotherViewModel我想能够回到第一个视图模型。 最初我做了这样的事情: public ICommand ReturnCommand { get { Dictionary<string, string> parameters = new Dictionary<string, string>(); // Add some stuff from this model to pass to the first view model return new MvxCommand(() => { ShowViewModel<FirstViewModel>(parameters); } } } 我添加了一个InitFromBundle到我的第一个视图模型,这也工作。 然而,然后我意识到,我原来的第一视图模型仍然存在(我注意到这是因为一些事件处理程序似乎是多次射击!)。 […]

无法绑定到mvvmcross中的ios表节单元格,子单元格按预期方式绑定

我试图创build一个TableView分组部分如下所示: 我绑定了一个表的列表。 一个组包含一些string属性和一个项目列表,而一个项目也包含一些string属性。 组和项目单元每个都有自己的类,它扩展了MvxTableViewCell 。 在每个单元格的内部,我绑定如下: 项目单元格: this.DelayBind(() => { var set = this.CreateBindingSet<ItemCellView, ItemCellViewModel>(); set.Bind(lblOne).To(item=> item.propertyOne); set.Apply(); }); 和集体单元: this.DelayBind(() => { var set = this.CreateBindingSet<GroupCellView, GroupCellViewModel>(); set.Bind(lblOne).To(group=> group.propertyOne); set.Apply(); }); 我在主视图中的MvxStandardTableViewSource扩展MvxStandardTableViewSource并使用重写的方法来获取表的各个单元格。 public override UIView GetViewForHeader返回一个组单元格视图,而protected override UITableViewCell GetOrCreateCellFor返回一个项目单元视图。 我的问题是,组视图单元格不绑定什么,而项目视图单元格绑定就好,即使我没有看到两者之间的明显差异。 组视图单元格正在构build,但是这只是没有发生在单元格内的绑定。 编辑:添加表视图源: private class TableSource : MvxStandardTableViewSource { private List<GroupCellViewModel> _groups; public new List<GroupCellViewModel> […]

解决“'NSUnknownKeyException',原因:这个类不是密钥X的编码兼容的键值”exception

我遇到了与本次提交中确定的完全相同的问题: MvvmCross / Xamarin“这个类不是关键值编码, 这个问题源于尝试在IOS CollectionView中使用MVVMCross数据绑定 那篇文章被封闭并被标记为重复,但是我不认为是这样。 作为解决scheme链接的文章提供了使用XCode作为开发环境时的解决方法。 上面链接的问题中描述的我的场景和场景是在Windows上使用Visual Studio与Xamarin一起构build的。 使用Visual Studio,XIB编辑器和布线sockets的做法各不相同。 我一直试图解决这个问题好几天了,而且还没有弄清楚什么。 我希望有人在Windows Visual Studio中看到这个解决scheme,他们可以共享。 (我很抱歉,我是新的,所以我不能在原来的post中作为评论)。 错误的堆栈跟踪如下 Foundation.MonoTouchException: Objective-C exception thrown. Name: NSUnknownKeyException Reason: [<NSObject 0x7c4eb9a0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key view. Native stack trace: 0 CoreFoundation 0x00928494 __exceptionPreprocess + 180 1 libobjc.A.dylib 0x08fa3e02 objc_exception_throw + 50 2 […]

适用于iOS的MvvmCross汉堡菜单

我使用的是https://www.marcbruins.nl/xamarin-ios-hamburger-menu-mvvmcross/ ,它适用于纵向: 但在风景方向我没有填充宽度: 菜单类: [MvxPanelPresentation (MvxPanelEnum.Left, MvxPanelHintType.ResetRoot, false)] public partial class MenuView : MvxViewController<MenuViewModel> { public override void ViewDidLoad () { base.ViewDidLoad (); EdgesForExtendedLayout = UIRectEdge.Right; MenuTableView.Source = new MenuTableViewSource(ViewModel.MenuItems); var separator = new UIView(new CGRect(0, 0, this.View.Frame.Size.Width, 0.8)); separator.BackgroundColor = UIColor.FromRGB(210, 210, 210); MenuTableView.TableHeaderView = separator; } } 表来源: public class MenuTableViewSource : UITableViewSource […]

有没有一种不同的方法来绑定MvvmCross 3.0.14中的iOS ICommands?

下载之后,Nv 1的MvvmCross N + 5的教程可以在Xamarin Studio中正常运行。 但是,如果我更新程序集从3.0.5到3.0.14,iOS项目不再生成。 错误与这两行有关: set.Bind(button).To(vm => vm.MyCommand); set.Bind(button2).To(vm => vm.GoSecondCommand); 错误消息如下所示: 无法将lambdaexpression式转换为非委托types的string 这种方式有没有改变? 对象浏览器使用Func<TSource, object>显示正确的方法Func<TSource, object>但似乎编译器想要使用string版本。 奇怪的是,它绑定到常规属性上面的两行工作正常,但ICommand绑定的东西失败。

MVVMCROSS Ios绑定ShowViewModel

通过调用showviewmodel方法在模型中导航之后,我在mvvmcross中遇到了数据绑定的问题。 在Android侧它的工作。 所以问题是,导航本身正在工作,但我没有从模型中获取任何数据。 在模型中导航: ShowViewModel<TeamEventDetailsViewModel>(new { eventID = item.ID }); 包含数据的ViewModel: public class TeamEventDetailsViewModel : EventDetailsViewModel { public TeamEventModel CurrentEvent { get { return MyCurrentEvent as TeamEventModel; } set { MyCurrentEvent = value; RaisePropertyChanged(() => CurrentEvent); TickerModel.Comments = value.Comments; RaisePropertyChanged(() => TickerModel); LineupModel.Team1Players = value.Team1Players; LineupModel.Team2Players = value.Team2Players; RaisePropertyChanged(() => LineupModel); } } private EventDetailsLineupViewModel […]