2016-07-25 1 views
0

Я пытаюсь создать экран, как андроид экрана ниже в прошивкой enter image description hereКак изменить ImageView динамически в UiTableViewCell?

Моя проблема в IOS является кружками. В iOS я использую ImageView для кругов с двумя файлами png: red_circle и green_circle. Мне нужно использовать красный круг для положительных значений и зеленый круг для отрицательных значений, но я не знаю, как проверить это условие в коде. Может кто-нибудь мне помочь? Я использую Xamarin.iOS с MvvmCross.

Это мой 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(); 
    } 


} 

Это мой UITableViewCell:

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

Где определяется ваш 'ImageView' для вашего круга? Возможно, вы могли бы создать конвертер, который возьмет ваш элемент управления «ImageView» и привяжет «UIImage» на основе положительного/отрицательного значения из «ViewModel». – Plac3Hold3r

+0

Я определил ImageView в XIB-файле. У меня есть два ImageViews для кругов и папка в моем проекте iOS, которая содержит два файла png: red_circle и green_circle. –

+0

У вас есть контекст для вашего «ImageView» из вашего MvxTableViewCell? – Plac3Hold3r

ответ

3

Я думаю, что самое простое решение для этого было бы использовать преобразователь, чтобы сделать переключение изображения цвет, основанный на значении, т.е. положительный = красный png и отрицательный/нейтральный (0) = зеленый 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"); 
    } 
} 

Вы, возможно, потребуется обновить FromBundle адрес, чтобы соответствовать, где ваши изображения сохраняются. Затем добавьте привязку для обновления изображений на основе значений из ViewModel. Что-то вроде:

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(); 

Заметь, я лично предпочитаю использовать строго типизированного имя преобразователя подход, но вы также можете просто использовать имя преобразователя в виде строки, как у вас есть в вашем вопросе.

+0

Спасибо, человек! Работает как шарм. –

Смежные вопросы