2016-07-23 112 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