【发布时间】:2014-10-03 22:56:34
【问题描述】:
我正在使用 ReactiveUI、Xamarin.Forms 和 XAML。我正在尝试使用 ListView 实现一个简单的场景,其中每一行都有一个删除按钮。这是 ListView XAML:
<ListView x:Name="playerListView" ItemsSource="{Binding Players}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal" Padding="20, 5, 20, 5">
<Label Text="{Binding .}" VerticalOptions="CenterAndExpand" HorizontalOptions="StartAndExpand" />
<Button x:Name="deleteButton" Text="Delete" Clicked="onDeleteClicked" VerticalOptions="CenterAndExpand" HorizontalOptions="EndAndExpand" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
如您所见,删除按钮注册了一个 Clicked 处理程序。这可行,但感觉不像 RxUI 方式。下面是代码:
private void onDeleteClicked(object sender, EventArgs e)
{
var button = (Button)sender;
this.ViewModel.RemovePlayer.Execute(button.BindingContext);
}
如何将这个 onDeleteClicked 事件处理程序替换为与我的 RemovePlayer 命令的声明性绑定?我看不到一个好的方法,因为我选择将 ListView 绑定到ReactiveList<string>,所以如果我尝试做Command="{Binding RemovePlayer}",它会失败,因为单元格绑定到一个字符串。
为了完整起见,这里是我的视图模型:
public class NewGameViewModel : ReactiveObject
{
public ReactiveList<string> Players { get; private set; }
public ReactiveCommand<Object> AddPlayer { get; private set; }
public ReactiveCommand<Object> RemovePlayer { get; private set; }
public ReactiveCommand<Object> StartGame { get; private set; }
public ReactiveCommand<Object> RandomizeOrder { get; private set; }
string newPlayerName;
public string NewPlayerName {
get { return newPlayerName; }
set { this.RaiseAndSetIfChanged(ref newPlayerName, value); }
}
public NewGameViewModel()
{
Players = new ReactiveList<string> ();
var canStart = this.Players.CountChanged.Select(count => count >= 3);
StartGame = canStart.ToCommand();
RandomizeOrder = canStart.ToCommand();
AddPlayer = this.WhenAnyValue(x => x.Players.Count, x => x.NewPlayerName,
(count, newPlayerName) => count < 7 && !string.IsNullOrWhiteSpace(newPlayerName) && !this.Players.Contains(newPlayerName))
.ToCommand();
RemovePlayer = ReactiveCommand.Create();
}
}
【问题讨论】:
-
我也有同样的问题。如何在 reactui 7.0 中实现这一点?
ReactiveCommand.Execute()不存在了吗?我应该只使用 reglar xamarin forms 命令来处理相对绑定情况吗?
标签: xaml reactiveui xamarin.forms