如何将图像绑定到ImageView的HighlightedImage属性?

时间:2014-02-19 12:00:03

标签: xamarin.ios mvvmcross

我目前正在尝试通过MvvmCross将两个图像绑定到iOS ImageView。 当ImageView处于“默认”状态时,应显示一个,当突出显示ImageView时,应显示另一个。

通过以下代码,我可以将Image绑定为默认状态。但是如何将“一个”加入“突出显示”状态呢?

public CategoryCell(IntPtr handle): base(string.Empty, handle)
{
    _imageViewLoader = new MvxImageViewLoader(() => this.imageView);
    this.DelayBind(() =>
    {
        var set = this.CreateBindingSet<CategoryCell, MaterialCategory>();
        set.Bind(titleLabel).To(materialCategory => materialCategory.Label);
        set.Bind(_imageViewLoader).To(materialCategory => materialCategory.ImageActiveUri);
        set.Bind(this).For(cell => cell.Selected).To(materialCategory => materialCategory.IsSelected);
        set.Apply();
    });
}

2 个答案:

答案 0 :(得分:1)

另一种方法,如果您不需要图像加载,即许多静态UX。

您可以设置如下 -

_imageView = new UIImageView(UIImage.FromFile("some/image/off.png"))
        {
            HighlightedImage = UIImage.FromFile("some/image/on.png")
        };

绑定它,例如&#34;已启用&#34;财产 -

this.DelayBind(() =>
        {
            var set = this.CreateBindingSet<SomeView, SomeViewModel>();

            set.Bind(_imageView).For(v => v.Highlighted).To(vm => vm.Enabled);

            set.Apply();
        });

并且不要忘记在您的LinkerPleaseInclude.cs中添加突出显示。

希望这有帮助

答案 1 :(得分:0)

我认为最好的解决方案是引入额外的属性ImageUri。在IsSelected的设置器中,您将ImageUri设置为选择状态。

<强>视图模型:

public class MaterialCategory : MvxViewModel
{
    //...
    public string ImageActiveUri { ... } // call UpdateImageUri() here, too
    public string ImageInactiveUri { ... } // call UpdateImageUri() here, too
    public string ImageUri { ... }
    public bool IsSelected 
    {
        get { return _isSelected; }
        set 
        {
            _isSelected = value;
            UpdateImageUri();
            RaisePropertyChanged(() => IsSelected);
        }
    }   

    private void UpdateImageUri() 
            {
        ImageUri = IsSelected ? ImageActiveUri : ImageInactiveUri;
    }
}

<强>绑定:

set.Bind(_imageViewLoader).To(materialCategory => materialCategory.ImageUri);
// instead of:
// set.Bind(_imageViewLoader).To(materialCategory => materialCategory.ImageActiveUri);