如何在 Android Xamarin Visual Studio 中单击按钮时在 MvxListView 上显示新项目
How to Display New Item on MvxListView on Button Click in Android Xamarin Visual Studio
我想在每次单击按钮时显示一行新的 TextView。我正在使用 MvvmCross,我知道我应该使用分配给布局模板的 MvxListView,但我不知道如何在单击按钮时在屏幕上显示它。
谁能给我一个从 ViewModel 执行此操作的简单代码示例,以及关于哪一行代码启动新 TextView 显示的非常简短的解释?
更新
我在下面提供我的代码:
ViewModel.cs
public class FirstViewModel
: MvxViewModel
{
private ObservableCollection<Unit> unitCodes;
public ObservableCollection<Unit> UnitCodes
{
get { return unitCodes; }
set { unitCodes = value; RaisePropertyChanged(() => UnitCodes); }
}
public IMvxCommand ButtonCommand { get; private set; }
public FirstViewModel()
{
unitCodes = new ObservableCollection<Unit>();
ButtonCommand = new MvxCommand(() =>
{
UnitCodes = UnitCodes ?? new ObservableCollection<Unit>();
UnitCodes.Add(new Unit("123", "Test Name"));
});
}
public class Unit : MvxViewModel
{
private string unitCode;
public string UnitCode
{
get { return unitCode; }
set { unitCode = value; RaisePropertyChanged(() => UnitCode); }
}
private string unitName;
public string UnitName
{
get { return unitName; }
set { unitName = value; RaisePropertyChanged(() => UnitName); }
}
public Unit() { }
public Unit(string unitCode, string unitName)
{
UnitCode = unitCode;
UnitName = unitName;
}
}
}
View.axml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="40dp"
local:MvxBind="Click ButtonCommand"
android:text="Click To Add" />
<Mvx.MvxListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
local:MvxItemTemplate="@layout/unitcodeitemlayout"
local:MvxBind="ItemSource UnitCodes" />
</LinearLayout>
unitcodeitemlayout.axml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="20dp"
local:MvxBind="Text UnitName" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="30dp"
local:MvxBind="Text UnitCode" />
</LinearLayout>
我的代码没有任何编译或 运行-time 错误,但是单击按钮时没有任何反应。我想要的是在每次单击按钮时向显示添加“123”和 "Test Name"。
为了设置ListView,看看这个MvvmCross tutorial
你可能会得到这样的结果:
视图模型:
public class MyListViewModel : MvxViewModel
{
private ObservableCollection<TextViewCellViewModel> _listItems;
public virtual ObservableCollection<TextViewCellViewModel> ListItems {
get {
return _listItems;
}
set {
_listItems = value;
RaisePropertyChanged(() => ListItems);
}
}
private IMvxCommand _addTextViewCommand;
public IMvxCommand AddTextViewCommand {
get {
_addTextViewCommand = _addTextViewCommand ?? new MvxCommand(AddTextView);
return _addTextViewCommand;
}
}
private void AddTextView()
{
ListItems = ListItems ?? new ObservableCollection<TextViewCellViewModel>();
ListItems.Add(new TextViewCellViewModel());
}
public class TextViewCellViewModel : MvxViewModel
{
private string _text;
public string Text { get { return _text; } set { _text = value; RaisePropertyChanged(() => Text); } }
public TextViewCellViewModel() { }
}
}
Android 列表视图布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="fill_vertical"
android:paddingRight="20dp"
android:paddingLeft="20dp">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/frameLayout"
android:paddingBottom="50dp">
<MvxListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical"
android:id="@+id/list_view_tripplanner_result"
android:divider="@android:color/transparent"
android:paddingTop="10dp"
android:clipToPadding="false"
android:dividerHeight="7dp"
android:descendantFocusability="afterDescendants"
local:MvxItemTemplate="@layout/cell_textview"
local:MvxBind="ItemsSource ListItems;" />
</FrameLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:paddingTop="5dp"
android:paddingBottom="10dp">
<Button
android:layout_width="match_parent"
android:layout_height="40dp"
local:MvxBind="Click AddTextViewCommand"
android:text="Add TextView"
android:textColor="@color/primary_white"
android:background="@android:color/darker_gray" />
</LinearLayout>
</RelativeLayout>
应该如下所示:(列表视图底部的通知按钮)
其中 @layout/cell_textview 看起来像这样:
ListView 的 ItemTemplate 布局为:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:textSize="20dp"
local:MvxBind="Text Text"/>
</LinearLayout>
你的代码是正确的。但是,您在 MvxListView
axml.
下拼错了 ItemsSource
应该是:
<Mvx.MvxListView
...
local:MvxBind = "ItemsSource UnitCodes"/>
我想在每次单击按钮时显示一行新的 TextView。我正在使用 MvvmCross,我知道我应该使用分配给布局模板的 MvxListView,但我不知道如何在单击按钮时在屏幕上显示它。
谁能给我一个从 ViewModel 执行此操作的简单代码示例,以及关于哪一行代码启动新 TextView 显示的非常简短的解释?
更新
我在下面提供我的代码:
ViewModel.cs
public class FirstViewModel
: MvxViewModel
{
private ObservableCollection<Unit> unitCodes;
public ObservableCollection<Unit> UnitCodes
{
get { return unitCodes; }
set { unitCodes = value; RaisePropertyChanged(() => UnitCodes); }
}
public IMvxCommand ButtonCommand { get; private set; }
public FirstViewModel()
{
unitCodes = new ObservableCollection<Unit>();
ButtonCommand = new MvxCommand(() =>
{
UnitCodes = UnitCodes ?? new ObservableCollection<Unit>();
UnitCodes.Add(new Unit("123", "Test Name"));
});
}
public class Unit : MvxViewModel
{
private string unitCode;
public string UnitCode
{
get { return unitCode; }
set { unitCode = value; RaisePropertyChanged(() => UnitCode); }
}
private string unitName;
public string UnitName
{
get { return unitName; }
set { unitName = value; RaisePropertyChanged(() => UnitName); }
}
public Unit() { }
public Unit(string unitCode, string unitName)
{
UnitCode = unitCode;
UnitName = unitName;
}
}
}
View.axml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="40dp"
local:MvxBind="Click ButtonCommand"
android:text="Click To Add" />
<Mvx.MvxListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
local:MvxItemTemplate="@layout/unitcodeitemlayout"
local:MvxBind="ItemSource UnitCodes" />
</LinearLayout>
unitcodeitemlayout.axml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="20dp"
local:MvxBind="Text UnitName" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="30dp"
local:MvxBind="Text UnitCode" />
</LinearLayout>
我的代码没有任何编译或 运行-time 错误,但是单击按钮时没有任何反应。我想要的是在每次单击按钮时向显示添加“123”和 "Test Name"。
为了设置ListView,看看这个MvvmCross tutorial
你可能会得到这样的结果:
视图模型:
public class MyListViewModel : MvxViewModel
{
private ObservableCollection<TextViewCellViewModel> _listItems;
public virtual ObservableCollection<TextViewCellViewModel> ListItems {
get {
return _listItems;
}
set {
_listItems = value;
RaisePropertyChanged(() => ListItems);
}
}
private IMvxCommand _addTextViewCommand;
public IMvxCommand AddTextViewCommand {
get {
_addTextViewCommand = _addTextViewCommand ?? new MvxCommand(AddTextView);
return _addTextViewCommand;
}
}
private void AddTextView()
{
ListItems = ListItems ?? new ObservableCollection<TextViewCellViewModel>();
ListItems.Add(new TextViewCellViewModel());
}
public class TextViewCellViewModel : MvxViewModel
{
private string _text;
public string Text { get { return _text; } set { _text = value; RaisePropertyChanged(() => Text); } }
public TextViewCellViewModel() { }
}
}
Android 列表视图布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="fill_vertical"
android:paddingRight="20dp"
android:paddingLeft="20dp">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/frameLayout"
android:paddingBottom="50dp">
<MvxListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical"
android:id="@+id/list_view_tripplanner_result"
android:divider="@android:color/transparent"
android:paddingTop="10dp"
android:clipToPadding="false"
android:dividerHeight="7dp"
android:descendantFocusability="afterDescendants"
local:MvxItemTemplate="@layout/cell_textview"
local:MvxBind="ItemsSource ListItems;" />
</FrameLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:paddingTop="5dp"
android:paddingBottom="10dp">
<Button
android:layout_width="match_parent"
android:layout_height="40dp"
local:MvxBind="Click AddTextViewCommand"
android:text="Add TextView"
android:textColor="@color/primary_white"
android:background="@android:color/darker_gray" />
</LinearLayout>
</RelativeLayout>
应该如下所示:(列表视图底部的通知按钮)
其中 @layout/cell_textview 看起来像这样:
ListView 的 ItemTemplate 布局为:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:textSize="20dp"
local:MvxBind="Text Text"/>
</LinearLayout>
你的代码是正确的。但是,您在 MvxListView
axml.
ItemsSource
应该是:
<Mvx.MvxListView
...
local:MvxBind = "ItemsSource UnitCodes"/>