UWP XAML ComboBox在选择项时抛出StackOverflowException

UWP XAML ComboBox在选择项时抛出StackOverflowException,xaml,combobox,uwp,Xaml,Combobox,Uwp,当在UI中更改选择时,我的XAML ComboBox控件陷入了无休止的循环中。组合框设置绑定属性的值。属性更改后,它将引发属性更改事件。这进而导致databinder再次更新属性。这会一直循环,直到我得到堆栈溢出异常 <ComboBox x:Name="OriginCountryCode" Grid.ColumnSpan="2" Grid.Column="2" SelectedValue="{x:Bind Mode=TwoWay, Path=View

当在UI中更改选择时,我的XAML ComboBox控件陷入了无休止的循环中。组合框设置绑定属性的值。属性更改后,它将引发属性更改事件。这进而导致databinder再次更新属性。这会一直循环,直到我得到堆栈溢出异常

                   <ComboBox x:Name="OriginCountryCode"  Grid.ColumnSpan="2" Grid.Column="2" SelectedValue="{x:Bind Mode=TwoWay, Path=ViewModel.OriginCountryCode}"  DisplayMemberPath="Value" SelectedValuePath="Key" ItemsSource="{x:Bind ViewModel.CountryCodes}"   />

属性值未更改时,不要引发
PropertyChanged

public string OriginCountryCode
{
    get => _origin.CountryCode;
    set
    {
        if (_origin.CountryCode != value)
        {
            _origin.CountryCode = value; 
            RaisePropertyChanged(nameof(OriginCountryCode));
        }
    }
}

这显然是答案,但我必须把它放在这里,看看有没有人碰到它。看来这是一个错误。解决这个问题的“正确”方法是使用命令,但仅仅为了获得一个值就需要大量代码。@ATL_DEV“解决这个问题的“正确”方法是使用命令”--不,不是。将依赖项属性绑定到viewmodel属性的正确方法是绑定它,并在viewmodel属性设置器中进行相等检查以防止递归。您将如何使用命令来完成此任务的任何部分?谢谢。那么你的意思是,这种行为是一个bug?我相信是这样。任何其他控件都不需要相等检查,即使是生成相同绑定代码(如开关按钮)的控件也不需要相等检查。我原以为响应eventchange的命令是“推荐”的方式,但在您的评论之后,我认为这可能只是一个bug。通常,.NET API会抛出特定的用法异常,而不是StackOverflowException或AccessFaultException。@ATL_DEV您是WPF专家,所以我不得不相信您的话。我很好奇,如果你有时间解释一下你是如何用一个命令完成这项工作的,那么,你可以回复SelectionChanged事件。这里有一个链接:
            case 15: // Views\QuotesPage.xaml line 77
                this.obj15 = (global::Windows.UI.Xaml.Controls.TextBox)target;
                (this.obj15).LostFocus += (global::System.Object sender, global::Windows.UI.Xaml.RoutedEventArgs e) =>
                {
                    if (this.initialized)
                    {
                        // Update Two Way binding
                        this.dataRoot.ViewModel.DestinationPostalCode = this.obj15.Text;
                    }
                };
                break;
            case 16: // Views\QuotesPage.xaml line 78
                this.obj16 = (global::Windows.UI.Xaml.Controls.ComboBox)target;
                (this.obj16).RegisterPropertyChangedCallback(global::Windows.UI.Xaml.Controls.Primitives.Selector.SelectedValueProperty,
                    (global::Windows.UI.Xaml.DependencyObject sender, global::Windows.UI.Xaml.DependencyProperty prop) =>
                    {
                    if (this.initialized)
                    {
                        // Update Two Way binding
                        this.dataRoot.ViewModel.DestinationCountryCode = (global::System.String)this.obj16.SelectedValue;
                    }
                });
                break;
public string OriginCountryCode
{
    get => _origin.CountryCode;
    set
    {
        if (_origin.CountryCode != value)
        {
            _origin.CountryCode = value; 
            RaisePropertyChanged(nameof(OriginCountryCode));
        }
    }
}