2017-01-30 2 views
0

ich ReactiveUIReactiveLists, in meinen Projekten mit, einer dieser ReactiveLists ist ItemsSourceDependencyProperty in meiner benutzerdefinierten WPF MultiSelectComboBox binded Und nach Auswahl einer Option in meiner ComboBox SetSelectedItems heißt Methode:ReactiveUI ReactiveList und DependencyProperty

private void SetSelectedItems() 
{ 
    if (SelectedItems == null) 
     SelectedItems = new List<object>(); 

    foreach (Node node in _nodeList) 
    { 
     if (node.IsSelected && node.Title != "All") 
     { 
      if (this.ItemsSource.Count() > 0) 
      { 
       var temp = SelectedItems.ToList(); 
       temp.Add(this.ItemsSource.First(x => x.ToString() == node.Title)); 
       SelectedItems = SelectedItems.Concat(temp); 
      } 
     } 
    } 
} 

Hier versuche ich SelectedItems-SelectedItemsProperty hinzuzufügen, das Problem, das ich habe ist, dass, wenn mein ItemsSourceProperty hat Typen unterscheiden als IEnumerable Bindung nicht funktionierte und Eigentum ist leer (ich habe Typen versucht: List, IList, ICollection, ReactiveList, IReactiveList), und wenn es als IEnumerableSystem.InvalidCastException geworfen ist, wenn ich versuche SelectedItems zu werfen aufzulisten:

var temp1 = (List<object>)SelectedItems; 

und wenn ich werde versuchen, Concat Verfahren wie Probe oben zu verwenden, wird SelectedItems-01.230.564 gesetzt. Also meine Frage ist, wie kann ich alements SelectedItems hinzufügen, wenn es an ReactiveList gebunden ist?

Es wurde entsprechend Artikel this erstellt.

+0

Versuchen SelectedItems ein ObservableCollection machen. BTW Ich glaube nicht, dass das Halten einer Sammlung von Objekttypen eine gute Übung ist. –

+0

Nach dem Wechsel zu ObservableCollection ist meine Liste leer, irgendwie hat die Bindung nicht funktioniert – Carlos28

+0

Es tut mir leid, vielleicht fehlt mir etwas, aber wo ist die ReactiveList hier? In dem Beispiel, das Sie kopiert haben, ist die SelectedItems-Eigenschaft als Dictionary definiert (mit der Angabe, dass List verwendet werden kann). Warum haben Sie sie in IEnumerable geändert? –

Antwort

0

Nun, es funktionierte, nachdem ich IList Schnittstelle verwendet:

public static readonly DependencyProperty ItemsSourceProperty = 
     DependencyProperty.Register("ItemsSource", typeof(IList), typeof(MultiSelectComboBox), new FrameworkPropertyMetadata(null, 
    new PropertyChangedCallback(MultiSelectComboBox.OnItemsSourceChanged))); 

public static readonly DependencyProperty SelectedItemsProperty = 
     DependencyProperty.Register("SelectedItems", typeof(IList), typeof(MultiSelectComboBox), new FrameworkPropertyMetadata(null, 
    new PropertyChangedCallback(MultiSelectComboBox.OnSelectedItemsChanged))); 

public IList ItemsSource 
{ 
    get { return (IList)GetValue(ItemsSourceProperty); } 
    set { SetValue(ItemsSourceProperty, value); } 
} 

public IList SelectedItems 
{ 
    get { return (IList)GetValue(SelectedItemsProperty); } 
    set { SetValue(SelectedItemsProperty, value); } 
} 

Und dann:

private void SetSelectedItems() 
{ 
    SelectedItems.Clear(); 

    foreach (Node node in _nodeList) 
    { 
     if (node.IsSelected && node.Title != "All") 
     { 
      if (this.ItemsSource.Count > 0) 
       SelectedItems.Add(this.ItemsSource.Cast<object>().ToList().First(x => x.ToString() == node.Title)); 
     } 
    } 
} 
Verwandte Themen