ListView SelectedItem 与 Xamarin Forms 和 ReactiveUI 问题的绑定
ListView SelectedItem Binding with Xamarin Forms and ReactiveUI Issue
我有一个显示名称的基本项目列表。单击其中一个列表项后,我需要导航到新屏幕。超级简单,对吧?我不知道哪里出了问题。
列表正在正确显示其项目。选择一个项目后,列表视图会突出显示相应的项目,但不会发生其他任何事情。我没有收到任何错误。好像视图和视图模型没有正确连接,或者视图模型中的订阅设置不正确。我是 ReactiveUI 的新手。
下面是我的代码的虚拟示例。
ItemListViewModel.cs
public IReactiveDerivedList<ItemTileViewModel> ItemTiles { get; protected set; }
public ItemTileViewModel SelectedItemTile { get; set; }
private void Initialize(){
ItemTiles = LoadedItems.CreateDerivedCollection(item => new ItemTileViewModel(item));
this.WhenAnyValue(x => x.SelectedItemTile)
.Where(tile => tile != null)
.Select(tile => tile.Model)
.Subscribe(item =>
{
HostScreen.Router.Navigate.ExecuteAsync(new ItemViewModel(item));
SelectedItemTile = null;
});
// We load the items
}
我不确定使用派生列表是否合适。我希望我没有提供足够的背景信息来提供反馈。
ItemListView.xaml.cs - 构造函数
this.OneWayBind(ViewModel, vm => vm.ItemTiles, v => v.ItemTiles.ItemsSource);
this.Bind(ViewModel, vm => vm.SelectedItemTile, v => v.ItemTiles.SelectedItem);
ItemListView.xaml
<ListView x:Name="ItemTiles">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<views:ItemTileView ViewModel="{Binding}" />
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
除非您简化了示例代码,否则应该存在问题:
public ItemTileViewModel SelectedItemTile { get; set; }
这是一个常规 属性,在修改时永远不会生成任何事件(例如,在选择时通过视图绑定设置)。
你应该像任何 RxUI 一样编写它 属性 相反:
string selectedItemTitle;
public string SelectedItemTile {
get { return selectedItemTitle; }
set { this.RaiseAndSetIfChanged(ref selectedItemTitle, value); }
}
我有一个显示名称的基本项目列表。单击其中一个列表项后,我需要导航到新屏幕。超级简单,对吧?我不知道哪里出了问题。
列表正在正确显示其项目。选择一个项目后,列表视图会突出显示相应的项目,但不会发生其他任何事情。我没有收到任何错误。好像视图和视图模型没有正确连接,或者视图模型中的订阅设置不正确。我是 ReactiveUI 的新手。
下面是我的代码的虚拟示例。
ItemListViewModel.cs
public IReactiveDerivedList<ItemTileViewModel> ItemTiles { get; protected set; }
public ItemTileViewModel SelectedItemTile { get; set; }
private void Initialize(){
ItemTiles = LoadedItems.CreateDerivedCollection(item => new ItemTileViewModel(item));
this.WhenAnyValue(x => x.SelectedItemTile)
.Where(tile => tile != null)
.Select(tile => tile.Model)
.Subscribe(item =>
{
HostScreen.Router.Navigate.ExecuteAsync(new ItemViewModel(item));
SelectedItemTile = null;
});
// We load the items
}
我不确定使用派生列表是否合适。我希望我没有提供足够的背景信息来提供反馈。
ItemListView.xaml.cs - 构造函数
this.OneWayBind(ViewModel, vm => vm.ItemTiles, v => v.ItemTiles.ItemsSource);
this.Bind(ViewModel, vm => vm.SelectedItemTile, v => v.ItemTiles.SelectedItem);
ItemListView.xaml
<ListView x:Name="ItemTiles">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<views:ItemTileView ViewModel="{Binding}" />
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
除非您简化了示例代码,否则应该存在问题:
public ItemTileViewModel SelectedItemTile { get; set; }
这是一个常规 属性,在修改时永远不会生成任何事件(例如,在选择时通过视图绑定设置)。
你应该像任何 RxUI 一样编写它 属性 相反:
string selectedItemTitle;
public string SelectedItemTile {
get { return selectedItemTitle; }
set { this.RaiseAndSetIfChanged(ref selectedItemTitle, value); }
}