我几次反对这一点,但我真的不知道为什么会发生这种情况.
我有一个受歧视的联盟,如:
type MStep<'A, 'B> =
| Shuttle of Quotations.Expr<'B> * Quotations.Expr<'B>
Run Code Online (Sandbox Code Playgroud)
工会还有更多,但这显示了基本问题.
如果我做:
let s1 = Shuttle(<@ l.SomeIntProp @>, <@ r.SomeIntProp @>)
let s2 = Shuttle(<@ l.SomeStrProp @>, <@ r.SomeStrProp @>)
Run Code Online (Sandbox Code Playgroud)
我收到编译器错误:
该表达式应该具有int类型,但这里有类型字符串
同样,如果我以其他顺序创建它们(字符串然后是int),我得到相同的错误,但反过来.
我可以看到编译器可能会'B根据我的用法进行推断,但是如果我想要'B真正的通用呢?
根据要求,这是一个更完整的例子:
type MStep<'A, 'B> =
| Shuttle of Quotations.Expr<'B> * Quotations.Expr<'B>
| Ident of Quotations.Expr<'B>
| Trans of Quotations.Expr<'A> * Quotations.Expr<'B> * ('A -> 'B)
let doMig (f:Table<'A>, t:Table<'B>, s:('A * 'B -> MStep<'C, 'D> list)) =
ignore()
let a …Run Code Online (Sandbox Code Playgroud) 我有CanExecute一个WPF命令看起来有所不同,这取决于我对编译器的明确程度; 问题是,我不希望必须明确.
private bool CanRemoveField()
{
return SelectedField != null &&
Context.Item.Id == 0
? _fieldsByFieldModel.ContainsKey(SelectedField)
: !_hasAnyCosts;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码,当查询一个Id != 0保持为真的项时,按钮启用,尽管 SelectedField是null,所以我希望条件短路并返回false.
代码略有调整:
private bool CanRemoveField()
{
return SelectedField != null &&
(Context.Item.Id == 0
? _fieldsByFieldModel.ContainsKey(SelectedField)
: !_hasAnyCosts);
}
Run Code Online (Sandbox Code Playgroud)
我已经在三元组周围引入了一些括号,并且现在显示了在没有选择字段时禁用按钮的所需行为.
鉴于它是一个三元组,如果,我已经预料到我想要的行为,而不需要括号,因为它应该被视为一个陈述,不是吗?
我有一些反应命令以及一些观察者持有一些信息,我正在尝试做类似的事情:
_navigate = ReactiveCommand.Create(CanNavigate);
_navigate.CombineLatest(navigationTarget, (_, tgt) => tgt)
.Subscribe(tgt => Navigation.NavigateTo(tgt));
Run Code Online (Sandbox Code Playgroud)
我尝试了几种不同的方法:
SelectManyZip我要么最终得到:
基本上我想要:
每次(并且仅)在执行命令时触发的可观察对象,以及拉入第二个可观察对象的最新值.
不能完全理解如何最好地实现这一目标......
我为WPF应用程序设置了标准的reactive-ui路由,我有一个ViewModel可以实现的接口来提供标题信息.
public interface IHaveTitle
{
IObservable<string> Title { get; }
}
Run Code Online (Sandbox Code Playgroud)
在一个视图模型中,我正在执行以下操作(用于演示目的):
public IObservable<string> Title => Observable.Interval(TimeSpan.FromSeconds(5)).Select(_ => DateTime.Now.ToLongTimeString());
Run Code Online (Sandbox Code Playgroud)
在我的主窗口屏幕中,我正在执行以下操作:
disposer(
ViewModel.Router.CurrentViewModel
.SelectMany(vm =>
((vm as IHaveTitle)?.Title.StartWith("") ??
Observable.Return("")).Select(s => string.IsNullOrEmpty(s) ? vm.UrlPathSegment : $"{vm.UrlPathSegment} > {s}"))
.ObserveOn(RxApp.MainThreadScheduler)
.BindTo(this, w => w.Title));
Run Code Online (Sandbox Code Playgroud)
凡disposer在Action<IDisposable>传递到this.WhenActivated扩展方法.
现在,当我浏览时,标题确实会改变以反映UrlPathSegment,而在主视图模型上,标题会更新以显示每5秒的时间.
然而,我所看到的问题是,即使我导航到不同的视图模型,主视图模型上的标题可观察仍然会导致标题上的更改.
我的问题是:我如何防止这种情况发生?为什么在我离开时它不会分离,因为我选择的是基于CurrentViewModel?