2017-10-03 7 views
1

Je crée une application WinForms avec DataGridView. La DataSource est une ReactiveList. L'ajout de nouveaux éléments à la liste ne met cependant pas à jour l'interface utilisateur.Comment utiliser ReactiveList afin que l'interface utilisateur soit mise à jour lorsque des éléments sont ajoutés/supprimés/modifiés

ViewModel

public class HomeViewModel: ReactiveObject 
{ 
    public ReactiveCommand<object> AddCmd { get; private set; } 

    ReactiveList<Model> _models; 
    public ReactiveList<Model> Models 
    { 
     get { return _models; } 
     set { this.RaiseAndSetIfChanged(ref _models, value); } 
    } 

    public HomeViewModel() 
    { 
     Models = new ReactiveList<Model>() { new Model { Name = "John" } }; 

     AddCmd = ReactiveCommand.Create(); 
     AddCmd.ObserveOn(RxApp.MainThreadScheduler); 
     AddCmd.Subscribe(_ => 
     { 
      Models.Add(new Model { Name = "Martha" }); 
     }); 
    } 
} 

public class Model 
{ 
    public string Name { get; set; } 
} 

Voir

public partial class HomeView : Form, IViewFor<HomeViewModel> 
{ 
    public HomeView() 
    { 
     InitializeComponent(); 
     VM = new HomeViewModel(); 

     this.OneWayBind(VM, x => x.Models, x => x.gvData.DataSource); 
     this.BindCommand(VM, x => x.AddCmd, x => x.cmdAdd); 
    } 

    public HomeViewModel VM { get; set; } 

    object IViewFor.ViewModel 
    { 
     get { return VM; } 
     set { VM = (HomeViewModel)value; } 
    } 

    HomeViewModel IViewFor<HomeViewModel>.ViewModel 
    { 
     get { return VM; } 
     set { VM = value; } 
    } 
} 
  1. La vue toujours montrer "John".
  2. Déboguer S'abonner Afficher les éléments ajoutés.
  3. Essayé avec ObservableCollection même résultat. How to use ReactiveList so UI is updated when new items are added
  4. Essayé avec IReactiveDerivedList même résultat. Does ReactiveUI RaiseAndSetIfChanged fire for List<T> Add, Delete, Modify?
+0

Vos commandes pourraient être simplifiées entre 0 .. AddCmd = ReactiveCommand.Create (() => Models.Add (.....)); –

Répondre

0

Je pense que ce que vous voulez est une ReactiveBindingList plutôt qu'une ReactiveList. Ceci est une version spécifique de WinForms de ReactiveList à des fins de liaison.

+0

Merci, mais. si j'utilise ReactiveBindingList je ne peux pas partager mes ViewModels et ReactiveBindingList ne fonctionne pas sur la modification comme 'Models [0] .Name =" Palma ";' – arturogranillo

+0

Eh bien, vous pouvez dériver un WinformsVM de votre VM initiale, qui crée un tas de CreateDerviedBindingLists() est sur ReactiveList de votre VM principale, de cette façon vous pouvez garder votre logique partagée entre les plates-formes. –