2016-07-23 108 views
2

說,我想有一個ObservableCollection<SomeModel>對應的水平滾動按鈕列表。我怎樣才能做到這一點?如何在Xamarin Forms中創建自定義可綁定視圖?

目前,我正在使用下面的代碼,但問題是它不適合MVVM模型,因爲它首先缺乏綁定。

foreach (var item in result.Items) 
{ 
    var button = new Button 
    { 
     FontSize = Device.GetNamedSize(NamedSize.Small, typeof(Button)), 
     HeightRequest = 50, 
     WidthRequest = 80, 
     Text = item.Id, 
    }; 

    _itemButtons.Add(button); 

    var frame = new Frame 
    { 
     Content = button, 
     Padding = new Thickness(0, 0, 0, 10) 
    }; 

    button.Clicked += OnItemClicked; 
    Device.BeginInvokeOnMainThread(() => buttonsStack.Children.Add(frame)); 
} 

如果名單應該是垂直的,我肯定會用一個ListView,但由於它不應該(而且有使ListView的水平,旋轉,然後在它旋轉的每個項目沒有「正常」的方式感覺錯了),我不能。

我想有排成一排的幾個按鈕(我顯然不知道他們在一開始數)像以下:

enter image description here

當上按鈕的用戶點擊,其餘的按鈕的不透明度設置爲0.3,並且它們變得不太明顯,從而產生錯覺,即單擊的按鈕是某種選定的選項。

+0

我們可以知道你想要達到什麼目的嗎?像使用一些圖紙的用例,所以也許我們可以給你一些其他的建議? 在我的選擇中,即使在我們談論PC時,水平滾動也是一種令人厭惡的體驗。因此,橫向滾動在電話中的體驗甚至更糟(CarouselView除外)。 無論如何,有一些水平的列表視圖(不知道他們是否支持水平滾動) – BraveHeart

+0

請參閱編輯 – nicks

回答

2

只看到您發佈的代碼,在我看來,您所做的事似乎完全沒問題,因爲您的代碼隱藏頁面僅針對您收集的Button s的UI元素進行了混淆。所以沒有理由將UI元素的集合移動到ViewModel。

我建議,當過您要添加一個按鈕,做的一樣,你正在做的通過調用buttonStack兒童Add(),當你想刪除一個Button,得到一個參考吧和對buttonStack調用Remove()兒童。

此外,如果您想要水平滾動操作,請將您的buttonStack設置爲ScrollView並將ScrollView.Orientation設置爲ScrollOrientation.Horizontal

如果我錯過了你的問題的重點,絕對讓我知道。

+0

不應該在ViewModel中關於選擇哪個按鈕的信息? – nicks

+1

@NikaGamkrelidze當然可以。我認爲你正在討論一場關於MVVM狂熱分子的爭論,而不是那些對它不那麼狂熱的人。在我看來,由於按鈕是UI元素,並不代表實際數據,我會將它們存儲在代碼隱藏中,如果這在我的應用程序中有意義。我只需要一個'private'類級別的'Button'變量來存儲所選的'Button'。 – hvaughan3