我有一个UserControl,它显示当前在ListBox中选择的项目。 ListBox的SelectedItem绑定到UserControl的ViewModel属性,该属性实现IViewFor接口。 ViewModel属性绑定到控件的DataContext。
当我使用代码在UserControl中配置绑定时,只要ViewModel设置为null(没有选择任何项目时),绑定就不会更新。如果我改为使用XAML,只要上下文变为null,绑定就会变为null。
有没有办法在视图构造函数中使用Bind方法实现相同的行为?
以下是TicketsView.xaml.cs绑定:
// Tickets to TicketsListBox.ItemsSource
this
.OneWayBind(ViewModel,
vm => vm.Tickets,
v => v.TicketsListBox.ItemsSource)
.AddTo(disposables);
// CurrentTicket to TicketsListBox.SelectedItem
this
.Bind(ViewModel,
vm => vm.CurrentTicket,
v => v.TicketsListBox.SelectedItem)
.AddTo(disposables);
// CurrentTicket to TicketView.ViewModel
this
.Bind(ViewModel,
vm => vm.CurrentTicket,
v => v.TicketView.ViewModel)
.AddTo(disposables);
以下是TicketView.xaml.cs绑定:
this
.WhenAnyValue(v => v.ViewModel)
.BindTo(this, v => v.DataContext)
.AddTo(disposables);
this
.OneWayBind(ViewModel,
vm => vm.Author,
v => v.Label.Content)
.AddTo(disposables);
每当ViewModel设置为null绑定时,不会更新。 XAML按预期工作:
<UserControl ...>
<Grid>
<Label x:Name="Label" Content="{Binding Author}" />
</Grid>
使用代码实现相同的任何方式?
答案 0 :(得分:0)
如何将// CurrentTicket替换为TicketView.ViewModel
this.ViewModel
.WhenAnyValue (vm => vm.CurrentTicket,
(vm) => vm == null ? null : vm
).BindTo (this.ViewModel, v => v.TicketView.ViewModel);
它将使TicketView.xaml.cs中的空绑定起作用。