2016-07-25 16 views
0

Ich versuche, einen Bildschirm wie der Android-Bildschirm unten in iOS enter image description hereWie kann ImageView in UiTableViewCell dynamisch geändert werden?

Mein Problem zu schaffen, in iOS die Kreise ist. In iOS verwende ich ImageView für die Kreise mit zwei PNG-Dateien: red_circle und green_circle. Ich muss roten Kreis für positive Werte und grünen Kreis für negative Werte verwenden, aber ich weiß nicht, wie man diese Bedingung im Code überprüft. Kann mir jemand helfen? Ich verwende Xamarin.iOS mit MvvmCross.

Das ist meine UIViewController:

public partial class MyProjectsView : MvxViewController<MyProjectsViewModel> 
{ 
    public MyProjectsView() : base("MyProjectsView", null) 
    { 
    } 

    public override void DidReceiveMemoryWarning() 
    { 
     base.DidReceiveMemoryWarning(); 

     // Release any cached data, images, etc that aren't in use. 
    } 

    public async override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 


     if (RespondsToSelector(new Selector("edgesForExtendedLayout"))) 
     { 
      EdgesForExtendedLayout = UIRectEdge.None; 
     } 

     var source = new MvxSimpleTableViewSource(TblProjects, MyProjectsItem.Key, MyProjectsItem.Key); 
     TblProjects.Source = source; 



     this.CreateBinding(source).To<MyProjectsViewModel>(viewModel => viewModel.Projetos).Apply(); 
     this.CreateBinding(LblSyncrhonizingData).For("Visibility").To<MyProjectsViewModel>(vm => vm.IsProgressBarVisible).WithConversion("Visibility").Apply(); 
     this.CreateBinding(Activity).For("Visibility").To<MyProjectsViewModel>(vm => vm.IsProgressBarVisible).WithConversion("Visibility").Apply(); 
     this.CreateBinding(LblDataSynchronized).For("Visibility").To<MyProjectsViewModel>(vm => vm.IsDataSynchronized).WithConversion("Visibility").Apply(); 

     var bounds = UIScreen.MainScreen.Bounds; 
     var carregamento = new CarregamentoIOS(bounds); 
     View.Add(carregamento); 

     ViewModel.Carregamento = carregamento; 
     await ViewModel.PreencheLista(); 
    } 


} 

Das ist mein UITableViewCell ist:

public partial class MyProjectsItem : MvxTableViewCell 
{ 
    public static readonly NSString Key = new NSString("MyProjectsItem"); 
    public static readonly UINib Nib = UINib.FromName("MyProjectsItem", NSBundle.MainBundle); 

    protected MyProjectsItem(IntPtr handle) : base(handle) 
    { 
     this.DelayBind(() => 
     { 
      this.CreateBinding(LblProjectName).To<Project>(project => project.Name).Apply(); 
      this.CreateBinding(LblPercentage).To<Project>(project => project.PercentCompleted).WithConversion("IntToPercentCompleted").Apply(); 
      this.CreateBinding(LblCostMoney).To<Project>(project => project.Cost.Variation).WithConversion("DoubleThousandToStringAbbreviation").Apply(); 
      this.CreateBinding(LblCostDays).To<Project>(project => project.Schedule.Variation).WithConversion("IntToDaysAbbreviation").Apply(); 
     });   
    } 

    public static MyProjectsItem Create() 
    { 
     return (MyProjectsItem)Nib.Instantiate(null, null)[0]; 
    }  


} 
+0

Wo wird Ihr ImageView für Ihren Kreis definiert? Vielleicht könntest du einen Konverter erstellen, der dir 'ImageView'-Kontrolle gibt und einen' UIImage' basierend auf dem positiven/negativen Wert von dir 'ViewModel' bindet. – Plac3Hold3r

+0

Ich definierte die ImageView in XIB-Datei. Ich habe zwei ImageViews für die Kreise und einen Ordner in meinem iOS-Projekt, der zwei PNG-Dateien enthält: red_circle und green_circle. –

+0

Haben Sie Kontext für Ihre ImageView aus Ihrer MvxTableViewCell? – Plac3Hold3r

Antwort

3

ich die einfachste Lösung für dieses denken wäre die Verwendung eines Wandlers machen das Schalten des Bildes zu tun Farbe basierend auf dem Wert, dh wenn positiv = rot png und negativ/neutral (0) = grün png.

public class CostColorConverter : MvxValueConverter<double, UIImage> 
{ 
    protected override UIImage Convert(double value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value > 0) 
      return UIImage.FromBundle("images/red_circle .png"); 

     return UIImage.FromBundle("images/green_circle.png"); 
    } 
} 

Sie werden wahrscheinlich die FromBundle Adresse aktualisieren müssen übereinstimmen, wo Ihre Bilder gespeichert sind. Fügen Sie dann eine Bindung hinzu, um die Bilder basierend auf den Werten aus Ihrem ViewModel zu aktualisieren. Etwas wie:

this.CreateBinding(ImgViewCostMoney) 
    .For(c => c.Image) 
    .To<Project>(project => project.Cost.Variation) 
    .WithConversion(new CostColorConverter()) 
    .Apply(); 
this.CreateBinding(ImgViewCostDays) 
    .For(c => c.Image) 
    .To<Project>(project => project.Schedule.Variation) 
    .WithConversion(new CostColorConverter()) 
    .Apply(); 

Hinweis, ich persönlich bevorzuge die stark typisierte Konverter Name Ansatz, aber Sie können auch einfach den Konverter Namen als String, wie Sie in Ihrer Frage haben.

+0

Danke Mann! Klappt wunderbar. –