2016-09-15 2 views
-1

Ich bin ein mit Custom Control abgeleitet von einem ItemsControl.Ersetzen NULL mit einem Standardwert in einem Itemssource IEnumerable

hatte ich die Idee von Two-Way Binding Issue of Unknown Object in WPF Custom Control Dependency Property

In der obigen Frage, sie nutzen die Sammlung in der Ansicht Modell

private ObservableCollection<string> _collection = new ObservableCollection<string>(); 

public ObservableCollection<string> Collection 
{ 
    get { return _collection; } 
    set 
    { 
     _collection = value; 
     if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Collection")); 
    } 
} 

Der XAML-Code ist

<Window x:Class="SampleControl.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:SampleControl" 
     Title="MainWindow" Height="400" Width="525"> 
    <Grid> 
     <local:BTextBox 
      ItemsSource="{Binding Collection}" 
      ProviderCommand="{Binding AutoBTextCommand}" 
      AutoItemsSource="{Binding SuggCollection}" /> 
    </Grid> 
</Window> 

Wenn ich die new ObservableCollection<string>(); entfernt dann wird es

private ObservableCollection<string> _collection; 

public ObservableCollection<string> Collection 
{ 
    get { return _collection; } 
    set 
    { 
     _collection = value; 
     if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Collection")); 
    } 
} 
werden

Nun ist die Immobilie Collection halten den Wert NULL. Diese Eigenschaft ist bind in ItemsSource. Also, wie kann ich die Daten in die Itemssource

Die Custom Methode Push ist

private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { 
    var tb = d as BTextBox; 
    if ((e.NewValue != null) && ((tb.ItemsSource as IList) != null)) { 
     foreach (var item in e.NewValue as IEnumerable) { 
      (tb.ItemsSource as IList).Add(item); 
     } 
    } 
} 

Bei diesem Verfahren überprüft es für NULL, WENN die ItemsSource ist NOT NULL, dann drückt er den Daten .

if ((e.NewValue != null) && ((tb.ItemsSource as IList) != null)). Wenn die ItemsSourceNOT NULL ist, dann wird nur dann bekommt Element in die Sammlung geschoben (tb.ItemsSource as IList).Add(item);

bitte mir helfen, wie sich der Wert in einem Null-able IEnumerable zuweisen?

+0

'Ist der Itemssource NOT NULL ist, dann drückt er die data' irgendwie vage ... –

+0

@JeroenvanLangen Bitte sehen Sie die obige Methode, es überprüft 'NULL' ~' if ((e.NewValue! = Null) && ((tb.ItemsSource als IList)! = Null)) '. Wenn die ItemsSource nicht NULL ist, dann wird das Item nur in die Collection '(tb.ItemsSource as IList) .Add (item); '. –

+0

Aber Sie binden die 'Collection' an die ItemsSource in Xaml, aber Sie fügen diese Elemente auch zur' AutoItemsSource' hinzu? –

Antwort

0

wir den Artikel hinzufügen, bevor Sie das Objekt wir ein erstellen müssen Instanz

if(this.ItemsSource == null) 
{ 
    this.ItemsSource = (new List<object>()).AsEnumerable(); 
} 

(tb.ItemsSource as IList).Add(item); 

Nun wird es keine NULL Referenz Ausnahme werfen.

0

Jedes Mal, wenn Sie fügen Daten in die ObservableCollection, fügen Sie einfach einen Konstruktor davor. Es ist meine übliche Praxis.

Zum Beispiel

Collection = new ObservableCollection<string>(); 
...add data to the collection here 

Je nach Situation.

bearbeiten

Wenn Sie eine Lösung auf dem Custom Control Ebene wollen, versuchen Sie vielleicht so etwas wie folgt aus:

var tb = d as BTextBox; 
if (((tb.ItemsSource as IList) == null)) 
    tb.ItemsSource = new IList<string>(); // or new ObservableCollection, List, or any suitable datatype, just to give default values 
if ((e.NewValue != null) && ((tb.ItemsSource as IList) != null)) { // probably remove the checking for ((tb.ItemsSource as IList) != null) since we initialized it 
... 
+0

Hier brauche ich die generische Lösung nicht im ViewModel Ebene, benötigen Lösung in Custom Control Level. –

+0

'IList ' ist nicht generisch. Wenn ich 'Int' Collection bind, dann ??? –

+0

Werfen Sie einen Blick auf diese Antwort: [Benutzersteuerung mit benutzerdefinierter ItemsSource-Abhängigkeitseigenschaft] (http://stackoverflow.com/a/4539697/6741868). Es ist interessant, wie sie e.oldValue und e.newValue zur Überprüfung und Behandlung von Nullfällen verwendet haben. –

Verwandte Themen