在N+1视频#34(Progress)中,有一个针对Android版本使用CreateBindingSet()的示例,这并不典型。但解说员也简单提到,在Windows平台上也可以做同样的事情。
然而,尽我所能,我无法将视图的属性绑定到 Windows Phone 上的 ModelView。我总是得到一个空引用异常.
我最接近的是下面的代码,包括 ReSharper 的建议。这是我的 FirstView.xaml.cs:
using Cirrious.MvvmCross.Binding.BindingContext;
using Whatever.ViewModels;
namespace Whatever {
// inheriting from IMvxBindingContextOwner was suggested by ReSharper also
public partial class FirstView : BaseView, IMvxBindingContextOwner {
public class MyBindableMediaElement
{
private string _theMediaSource = "whatever";
public string TheMediaSource
{
get
{
return _theMediaSource;
}
set
{
_theMediaSource = value;
}
}
}
public FirstView()
{
InitializeComponent();
_mediaElement = new MyBindableMediaElement(this.theMediaElement);
var set = this.CreateBindingSet<FirstView, FirstViewModel>();
// the corresponding view model has a .SongToPlay property with get/set defined
set.Bind(_mediaElement).For(v => v.TheMediaSource).To(vm => vm.SongToPlay);
set.Apply();
}
public IMvxBindingContext BindingContext { get; set; } // this was suggested by ReSharper
}
创建视图后,我会在 MvxBaseFluentBindingDescription.cs 中收到 NullReferenceException。具体位置如下:
protected static string TargetPropertyName(Expression<Func<TTarget, object>> targetPropertyPath)
{
var parser = MvxBindingSingletonCache.Instance.PropertyExpressionParser; // <----- exception here**
var targetPropertyName = parser.Parse(targetPropertyPath).Print();
return targetPropertyName;
}
我还没有看到在 Windows Phone 模拟器上创建绑定集的工作示例。有人让它发挥作用吗?谢谢。
我可以确认,叙述者说这句话有点太轻率了,而没有真正考虑过他会怎么做......
然而,只要您愿意,只要付出一点努力,您绝对可以让 CreateBindingSet 在 Windows 中工作。
在开始之前,请考虑一些替代方案 - 特别是,我怀疑大多数人会使用 Windows DependencyProperty 绑定或一些带有 PropertyChanged 事件订阅的手工编写的代码隐藏。
如果您确实想将 CreateBindingSet 代码添加到 Windows 项目中,则:
- 将 Binding 和 BindingEx 程序集添加到您的 Ui 项目中 - 最简单的方法是使用 nuget 添加 BindingEx 包。
- 在您的Setup类中,重写InitializeLastChance并利用这个机会创建一个MvxWindowsBindingBuilder实例并调用
DoRegistration
在那个建筑商身上。 n=35 西藏绑定视频中介绍了前两个步骤 - 第二步将初始化绑定框架并帮助您克服当前的“NullReferenceException”(有关代码,请参阅BindMe.Store/Setup.cs https://github.com/slodge/NPlus1DaysOfMvvmCross/blob/master/N-35-Tibet/BindMe.Store/Setup.cs)
- 在您看来,您需要实现 IMvxBindingContextOwner 接口,并且需要确保创建绑定上下文。你应该能够简单地做到这一点
BindingContext = new MvxBindingContext();
- 在您看来,您需要确保为绑定上下文提供与 Windows DataContext 相同的 DataContext(视图模型)。对于电话页,最简单的方法可能就是添加
BindingContext.DataContext = this.ViewModel;
到您手机页面的末尾OnNavigatedTo
方法。如果您也打算在其他类中使用 Mvx Binding,则步骤 3 和 4 都可以放入您的 BaseView 中。
- 完成此操作后,您应该能够使用 CreateBindingSet 代码 - 尽管请确保所有绑定都在
new MvxBindingContext()
已经被创造了。
我现在没有 Windows 机器,所以我担心这个答案代码未经测试 - 如果它有效或无效,请再次发布。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)