UWP ComboBox

时间:2017-03-05 03:59:33

标签: xaml uwp uwp-xaml

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

StackOverflowException发生在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;
}

在此区块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?

1 个答案:

答案 0 :(得分:1)

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

例如像::

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

实际问题似乎是引起了StackOverflowException,因为VM的CutShape中的setter很可能会通知有关更改的值,即使它没有更改。所以你也可以尝试:

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

我不确定Set-method正在做什么,但你很可能摆脱了ref-keyword。