Bind data inside ListBox using code-behind in ReactiveUI
Asked Answered
T

1

6

I have WPF listbox:

<ListBox Name="FileDownloads" SelectionMode="Extended">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Name="Url" Text="{Binding Url}" />
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

I like the ability to bind ListBox by name from code behind using: this.OneWayBind(ViewModel, vm => vm.DownloadManager.FileDownloads, v => v.FileDownloads.ItemsSource); Having binding in code-behind helps with refactoring.

Is there any way to bind Url texbox inside the listbox using code-behind?

Tournament answered 23/8, 2014 at 20:49 Comment(0)
S
7

Is there any way to bind Url textbox inside the listbox using code-behind?

Not at the moment. You can either use XAML bindings like you're doing now, or you can put your data templates inside UserControls.

A consolation to this somewhat more cumbersome approach, is that if you register your data template UserControls and implement IViewFor<TViewModel> on them:

Splat.Locator.CurrentMutable.Register(typeof(MyView), typeof(IViewFor<MyViewModel>));

Then, you can write the ListBox simply as:

<ListBox Name="FileDownloads" SelectionMode="Extended" />

This line will automatically wire up a DataTemplate for you:

this.OneWayBind(ViewModel, vm => vm.DownloadManager.FileDownloads, v => v.FileDownloads.ItemsSource);
Sperm answered 24/8, 2014 at 1:39 Comment(2)
Great, Thanks! The only thing I needed to write Splat.Locator.CurrentMutable.Register(() => new FileDownloadControl(), typeof(IViewFor<FileDownload>)); not Splat.Locator.CurrentMutable.Register(typeof(FileDownloadControl), typeof(IViewFor<FileDownload>));Tournament
I also added a 'Delete' button inside UserControlView and binded it to ReactiveCommand in a UserControlViewModel. When I subscribe to Delete command from UserControlViewModel - it works fine. When I subscribe to Delete command from UserControlView - it is not fired. I used this.BindCommand(ViewModel, vm => vm.Delete, v => v.Delete); ViewModel.Delete.Subscribe(x => MessageBox.Show("Click From View")); and Delete = ReactiveCommand.Create(); Delete.Subscribe(x=>MessageBox.Show("Click from ViewModel"));Tournament

© 2022 - 2024 — McMap. All rights reserved.