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?
答案 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。