2015-06-12 2 views
1

Я пытаюсь реализовать решение, чтобы увеличить размер ListViewCell при использовании с использованием Xamarin Forms (и, при необходимости, настраиваемых визуализаторов).Расширение размера ячейки ListView при нажатии

Я все еще довольно новичок в C#, и идея привязки данных по-прежнему немного неясна для меня, однако, похоже, что это способ решить эту проблему (возможно, что-то вроде строк привязки Height/HeightRequest свойства ячейки?).

Мои попытки пока не увенчались успехом.

Если бы кто-нибудь мог дать мне толчок в правильном направлении, это было бы очень признательно.

Спасибо!

ответ

6

ViewCellне подвергать Height в виде BindableProperty в Xamarin.Forms 1.4.2x

Однако, если вы создаете в вашем Model вы можете достичь изменения высоты еще, как показано ниже свой собственный BindableProperty: -

Модель: -

public class MenuItem2 : BindableObject 
{ 

    public static readonly BindableProperty TextProperty = BindableProperty.Create<MenuItem2, string>(p => p.Text, default(string)); 
    public static readonly BindableProperty CellHeightProperty = BindableProperty.Create<MenuItem2, int>(p => p.CellHeight, default(int)); 


    public string Text 
    { 
     get { return (string)GetValue(TextProperty); } 
     set { SetValue(TextProperty, value); } 
    } 

    public int CellHeight 
    { 
     get { return (int)GetValue(CellHeightProperty); } 
     set { SetValue(CellHeightProperty, value); } 
    } 
} 

XAML: -

<StackLayout> 

    <Button x:Name="cmdButton1" Text="Change Cell Heights" Clicked="cmdButton1_Clicked"/> 

    <ListView x:Name="lstItems" /> 

</StackLayout> 

XAML Code-Behind: -

lstItems.HasUnevenRows = true; 
    lstItems.ItemTemplate = new DataTemplate(typeof(Classes.MenuCell2)); 
    // 
    lstItems.ItemsSource = new List<MenuItem2> 
    { 
     new MenuItem2(), 
     new MenuItem2(), 
     new MenuItem2(), 
     new MenuItem2(), 
    }; 

Если вы не установили .HasUnevenRows вы не быть в состоянии изменить высоту ячейки.

void cmdButton1_Clicked(object sender, EventArgs e) 
    { 
     Random objRandom = new Random();    
     // 
     var objItems = lstItems.ItemsSource; 
     // 
     foreach (MenuItem2 objMenuItem in objItems) 
     { 
      int intNewCellHeight = objRandom.Next(80, 160); 
      objMenuItem.CellHeight = intNewCellHeight; 
      objMenuItem.Text = "Cell Height = " + intNewCellHeight.ToString(); 
     } 
    } 

Пользовательские ViewCell: -

public class MenuCell2 : ViewCell 
{ 
    public MenuCell2() 
    { 
     Label objLabel = new Label 
     { 
      YAlign = TextAlignment.Center, 
      TextColor = Color.Yellow,     
     }; 
     objLabel.SetBinding(Label.TextProperty, new Binding("Text")); 


     StackLayout objLayout = new StackLayout 
     { 
      Padding = new Thickness(20, 0, 0, 0), 
      Orientation = StackOrientation.Horizontal, 
      HorizontalOptions = LayoutOptions.StartAndExpand, 
      Children = { objLabel } 
     }; 

     Frame objFrame_Inner = new Frame 
     { 
      Padding = new Thickness(15, 15, 15, 15), 
      HeightRequest = 36, 
      OutlineColor = Color.Accent, 
      BackgroundColor = Color.Blue, 
      Content = objLayout,     
     }; 

     Frame objFrame_Outer = new Frame 
     { 
      Padding = new Thickness(0, 0, 0, 10), 
      Content = objFrame_Inner 
     }; 

     View = objFrame_Outer;    

     this.BindingContextChanged += MenuCell2_BindingContextChanged; 
    } 

    void MenuCell2_BindingContextChanged(object sender, EventArgs e) 
    { 
     MenuItem2 objMenuItem = (MenuItem2)this.BindingContext; 
     objMenuItem.PropertyChanged += objMenuItem_PropertyChanged; 
    } 

    void objMenuItem_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
    { 
     switch (e.PropertyName) 
     { 
      case "CellHeight": 
       this.Height = (this.BindingContext as MenuItem2).CellHeight; 
       (this.View as Frame).ForceLayout(); 
       break; 
     } 
    } 

Не забудьте позвонить ForceLayout на корневой элемент ViewCell «s View собственности, поэтому он может перерисовывать правильно.

Это даст вам результат что-то похожее на следующее (проверено только на WindowsPhone в настоящее время): -

List with custom cell heights

Для того, чтобы сделать это на ViewCell прослушивают, на XAML странице добавления : -

lstItems.ItemTapped += lstItems_ItemTapped; 

, а затем изменить model для пункта к чему-то вроде этого: -

void lstItems_ItemTapped(object sender, ItemTappedEventArgs e) 
    { 
     (e.Item as MenuItem2).CellHeight = 200; 
    } 
+0

красиво ответил, большое спасибо !! –

+0

Спасибо, ваш ответ действительно помог – trevorgk

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