MVVMCross - ListItem中的按钮

时间:2013-11-18 10:03:34

标签: mvvmcross

我创建了一个名为User的Model类的List。 List Item包含一个按钮,我想在包含列表的viewmodel上触发一个命令,而不是按钮。是否可以将ItemsSource设置为ObservableCollection,但将List的DataContext设置为包含ObservableCollection的ViewModel。

我有一个ViewModel,它包含一个ObservaleCollection:

FindFriendsViewModel:

    private ObservableCollection<User> _SearchResult = new ObservableCollection<User>();

    public ObservableCollection<User> SearchResult
    {
        get
        {
            return _SearchResult;
        }
        set
        {
            _SearchResult = value;
        }
    }

显示List,FindFriendsView:

的视图
            <LinearLayout
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/LoginActivity_LoginFormContainer"
                android:layout_marginTop="10dip">
                <MvxListView
                    android:id="@+id/FindFriendsView_SearchResult"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:orientation="vertical"
                    android:fastScrollEnabled="true"
                    android:background="@color/transparent"
                    android:cacheColorHint="@color/transparent"
                    local:MvxItemTemplate="@layout/listitem_user"
                    local:MvxBind="ItemsSource SearchResult" />
            </LinearLayout>

ListItem:

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/imageview"
    android:layout_marginLeft="10dp"
    android:orientation="vertical"
    android:layout_centerVertical="true">
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:textSize="18dp"
            local:MvxBind="Text FirstName"
            android:layout_gravity="center" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="2dp"
            android:singleLine="true"
            android:textSize="18dp"
            local:MvxBind="Text LastName"
            android:layout_gravity="center" />
    </LinearLayout>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:textSize="16dp"
        android:textColor="@color/darkgrey"
        local:MvxBind="Text Email" />
</LinearLayout>
<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:padding="5dp">
    <Button
        android:id="@+id/ListItemUser_BtnFollow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@style/GreyButton"
        android:drawableLeft="@drawable/ic_action_user_red"
        android:textColor="@color/black"
        android:textSize="13dp"
        android:text="@string/listitem_user_follow"
        local:MvxBind="Click FollowCommand; Visibility IsFriend, Converter=Visibility"/>
    <Button
        android:id="@+id/ListItemUser_BtnFollowing"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@style/RedButton"
        android:drawableLeft="@drawable/ic_action_tick"
        android:textSize="13dp"
        android:clickable="false"
        android:text="@string/listitem_user_following"
        local:MvxBind="Visibility IsFriend, Converter=InvertedVisibility"/>
</LinearLayout>

ListItem包含两个按钮,其中一次只能看到其中一个按钮,其中只有一个包含Click命令。我希望能够让Button在FindFriendsViewModel上触发命令,而不是模型类用户。

3 个答案:

答案 0 :(得分:0)

您可以利用弱引用(或在MvvmCross中实现的WeakSubscribe)来实现您想要的功能。在视图模型中,您可以订阅绑定到列表的模型的INotifyPropertyChanged。一旦您收到按钮触发ICommand的通知,您的ViewModel就可以做出相应的响应。

这是一个小例子

using Cirrious.CrossCore.WeakSubscription;

foreach (var sale in Sales)
{                
    var token = sale.WeakSubscribe(sale_PropertyChanged);
}

void sale_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "Accepted")
    {
        CalculateSalesTotals();
    }
}

答案 1 :(得分:0)

最好尝试使用swipelistview。我会这样做,希望可以包装这个lib。目前我用longpresss&lt; - &gt;解决了我的问题(listitem内的按钮)上下文菜单。

答案 2 :(得分:0)

每当您需要从listitem中触发命令时,您需要在listitem类周围使用viewmodel包装器。包装器将实现该命令,然后axml将绑定到包装器中的命令。如果希望命令在列表视图模型中执行,则可以将操作传递给包装器,并在视图模型中执行操作。