我创建了一个名为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上触发命令,而不是模型类用户。
答案 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将绑定到包装器中的命令。如果希望命令在列表视图模型中执行,则可以将操作传递给包装器,并在视图模型中执行操作。