我正在使用 ReactiveUI 及其路由器。
我的一些 IRoutableViewModel
s 实现了一个接口(interface) IHaveCommands
,它有一个属性 IEnumerable<IReactiveCommand> Commands { get; }
所以,我想要的是我的 IScreen
中当前 View 模型的命令列表实现,AppBootstrapper
.
什么是“正确”的实现方式?
我有点让它可以与以下代码一起工作,但我的直觉告诉我还有其他更好的方法....
public class AppBootstrapper : ReactiveObject, IScreen
{
public IRoutingState Router { get; private set; }
public AppBootstrapper(IMutableDependencyResolver dependencyResolver = null, IRoutingState testRouter = null)
{
Router = testRouter ?? new RoutingState();
Router.CurrentViewModel.Where(x => x != null)
.Select(x => typeof(IHaveCommands).IsAssignableFrom(x.GetType()) ? ((IHaveCommands)x).Commands : null)
.ToProperty(this, x => x.Commands, out _toolbarCommands);
...
}
readonly ObservableAsPropertyHelper<IEnumerable<CommandSpec>> _toolbarCommands;
public IEnumerable<CommandSpec> ToolbarCommands { get { return _toolbarCommands.Value; } }
}
有什么建议吗?
这对我来说太棒了!除了一些可能的小的可读性修正之外,这是你应该做的™。这是一个稍微干净的版本:
Router.CurrentViewModel
.Select(x => {
var haveCmds = x as IHaveCommands;
return haveCmds != null ? haveCmds.Commands : null;
})
.ToProperty(this, x => x.Commands, out _toolbarCommands);
我是一名优秀的程序员,十分优秀!