MvxImageView
(アンドロイドCardView内)でトリガ可能なアニメーションを実装して、カードのViewModelのプロパティの変更時にイメージに色(緑色または赤色)をオーバーレイしようとしています。 。 Stuart Lodgeの例hereを使用してカスタムクラスDynamicImageViewを作成しました。私がクリックしたときに、このプロパティは、カードへのクリックに変更し、MvvmCrossカスタムバインディングがRaisePropertyChangedによって通知されない
private string _animatingColor;
public string AnimatingColor {
get
{
return _animatingColor;
}
set
{
_animatingColor = value;
Debug.WriteLine("AnimatingColor set to " + value);
RaisePropertyChanged(() => AnimatingColor);
}
}
:標準MvvmCross表記以下、私も定義された整合性を持って、この制御のためのViewModel内
public class DynamicImageView : MvxImageView
{
public DynamicImageView(Context context) : base(context)
{
}
public DynamicImageView(Context context, IAttributeSet attrs) : base(context, attrs)
{
}
public DynamicImageView(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr)
{
}
protected DynamicImageView(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
{
}
protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
Drawable d = this.Drawable;
if (d != null)
{
// ceil not round - avoid thin vertical gaps along the left/right edges
int width = MeasureSpec.GetSize(widthMeasureSpec);
int height = (int)Math.Ceiling(width * (float)d.IntrinsicHeight/d.IntrinsicWidth);
this.SetMeasuredDimension(width, height);
}
else
{
base.OnMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
private ObjectAnimator colorFilterAnimation;
private string _animatingColor;
public string AnimatingColor
{
set
{
System.Diagnostics.Debug.WriteLine("Animation triggered");
if (value != _animatingColor)
{
_animatingColor = value;
colorFilterAnimation = ObjectAnimator.OfObject((ImageView)this, "colorFilter", new ArgbEvaluator(), 0, 0);
switch (value)
{
case "red":
colorFilterAnimation.SetObjectValues(0, new Color(100, 0, 0, 80).ToArgb());
System.Diagnostics.Debug.WriteLine("Starting Red Animation");
break;
case "green":
colorFilterAnimation.SetObjectValues(0, (int)Color.Green);
System.Diagnostics.Debug.WriteLine("Starting Green Animation");
break;
}
colorFilterAnimation.SetDuration(1000);
colorFilterAnimation.Start();
}
}
}
}
、私はプロパティ
set
の中からデバッグプリントを見ることができますが、コントロール内でAnimatingColorのために
set
をトリガしているようには見えません。コントロールは通常通りAXMLで参照されています。
<DynamicImageView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
local:MvxBind="ImageUrl 'http:'+Profile.Headshot.Url; AnimatingColor .AnimatingColor" />
、それは価値がある何のため、IMAGEURLは正しく結合しない、と期待通りのアップデートは、URLはViewModelにに変更されたとき。さらに、Debug.PrintLine("Animation triggered")
は、カードが作成されたときには印刷されますが、ViewModelでプロパティが変更されたときは決して印刷されません。
'AnimatingColor'のカスタムバインディングを作成しましたか?もしそうなら、それを投稿できますか? –
あなたは、あなたがそれを言うときにあなたが何を意味するのか分からないので - 私の問題がどこにあるのかと期待しています。しかし、n + 1日のサンプルに基づいて、単にAnimatingColorの文字列を使用しているので、追加されたプロパティに文字列をバインドするために何も必要がないことはわかりませんでした。編集:もちろん、私はこのバインディングの仕組みが間違っている可能性が非常に高いです。できるだけ多くの情報を提供したかっただけです。 –
'local:MvxBind'でバインドするプロパティは、[カスタムバインディング](http://slodge.blogspot.com/2013/06/n28-custom-bindings-n1-days-of-mvvmcross.html)を持つ必要があります。彼らが何かをするために書かれた。使用しているImageUrlバインディングが期待どおりに機能する理由は、MvvmCross自体のどこかにターゲットバインディングが書き込まれているためです。デバッグ出力ウィンドウを確認したら、MvvmCrossが 'AnimatingColor'のコントロールをバインドできないというメッセージが表示されますか? –