【问题标题】:StackOverflowException in UWP ComboBoxUWP 组合框中的 StackOverflowException
【发布时间】:2017-03-05 15:33:10
【问题描述】:

UWP ComboBox 正在生成 StackOverflowException。

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

CutShape 和 CutoutsList 在 ViewModel 中定义

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 返回 5 个可供选择的切口。

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); } }
}

Page.g.cs 中发生 StackOverflowException

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;
}

在此块中 value == ""targetNullValue == null。异常发生在obj.SelectedItem = value;这一行

虽然ComboBox在Grid中的ListView中,但是第一次调用时会出现异常

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

然而,随之而来的是许多(我在停止计数之前数了 60 个)调用

Set_Windows_UI_Xaml_Controls_Primitives_Selector_SelectedItem

为什么这个 ComboBox 会导致 StackOverflowException?

【问题讨论】:

    标签: xaml uwp uwp-xaml


    【解决方案1】:

    您很可能通过删除 TwoWay 绑定或使用旧的绑定方法来完成这项工作。

    例如这样::

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

    实际的问题似乎是 StackOverflowException 是因为您在 VM 的 CutShape 中的设置器很可能会通知更改的值,即使它没有更改。所以你也可以试试:

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

    我不确定 Set 方法在做什么,但您很可能会摆脱 ref 关键字。

    【讨论】:

    • 只需要更改为 Binding。谢谢@Mikael Koskinen
    • DependencyProperties 也会抛出 stackoverflow 异常,可能是出于同样的原因。旧装订作品
    猜你喜欢
    • 2017-11-05
    • 2017-04-26
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 2016-02-22
    • 2018-11-04
    • 2017-06-26
    相关资源
    最近更新 更多