2017-03-05 1 views
2

Eine UWP ComboBox generiert eine StackOverflowException.StackOverflowException in UWP ComboBox

<Grid Name="CutoutsGrid" 
    <ListView 
     <ComboBox 
      ItemsSource="{x:Bind CutoutsList}" 
      SelectedItem="{x:Bind CutShape,Mode=TwoWay}" 
     /> 
    </ListView> 
</Grid> 

CutShape und CutoutsList sind in der Ansichtsmodell

public class ViewModel : ViewModelBase 
{ 
    string _CutShape = default(string); 
    public string CutShape { get { return _CutShape; } set { Set(ref _CutShape, value); } } 

    public List<Cutout> CutoutsList { get { return MatboardService.GetCutoutsList(); } } 

CutoutsList kehrt 5 Ausschnitte zur Auswahl.

public class Cutout : BindableBase 
{ 
    string _ItemCode = default(string); 
    public string ItemCode { get { return _ItemCode; } set { Set(ref _ItemCode, value); } } 

    string _ItemDescription = default(string); 
    public string ItemDescription { get { return _ItemDescription; } set { Set(ref _ItemDescription, value); } } 

    decimal _MinutesLabor = default(decimal); 
    public decimal MinutesLabor { get { return _MinutesLabor; } set { Set(ref _MinutesLabor, value); } } 
} 

Die Stackoverflow tritt in Page.g.cs

public static void Set_Windows_UI_Xaml_Controls_Primitives_Selector_SelectedItem(global::Windows.UI.Xaml.Controls.Primitives.Selector obj, global::System.Object value, string targetNullValue) 
{ 
    if (value == null && targetNullValue != null) 
    { 
     value = (global::System.Object) global::Windows.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(global::System.Object), targetNullValue); 
    } 
    obj.SelectedItem = value; 
} 

In diesem Block value == "" und targetNullValue == null. Die Ausnahme auf der Linie tritt obj.SelectedItem = value;

Obwohl die ComboBox in einem Listview in einem Grid ist, die Ausnahme von

auf dem ersten Aufruf tritt
public List<Cutout> CutoutsList { get { return MatboardService.GetCutoutsList(); } } 

jedoch, dass von vielen gefolgt wird (ich zählte 60, bevor ich aufgehört Zählen) Anrufe an

Set_Windows_UI_Xaml_Controls_Primitives_Selector_SelectedItem 

Warum verursacht diese ComboBox eine StackOverflowException?

Antwort

1

Sie können dies sehr wahrscheinlich tun, indem Sie entweder die TwoWay-Bindung entfernen oder die ältere Binding-Methode verwenden.

Zum Beispiel wie folgt ::

<Grid Name="CutoutsGrid" 
    <ListView 
     <ComboBox 
      ItemsSource="{Binding CutoutsList}" 
      SelectedItem="{Binding CutShape,Mode=TwoWay}" 
     /> 
    </ListView> 
</Grid> 

Das eigentliche Problem scheint zu sein, dass die Stackoverflow verursacht, weil Ihre Setter in VMs CutShape sehr wahrscheinlich ist, über den geänderten Wert benachrichtigt, obwohl es nicht ändert. So können Sie auch versuchen:

public string CutShape 
{ 
    get { return _CutShape; } 
    set 
    { 
    if (_CutShape != value) 
     Set(ref _CutShape, value); 
    } 
} 

Ich bin nicht sicher, was die Set-Methode zu tun ist, aber man kann sehr wahrscheinlich von dem ref-Schlüsselwort loszuwerden.

+0

Wechsel zu Binding war alles, was es brauchte. Danke @Mikael Koskinen – Vague

Verwandte Themen