Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重新加载时Wpf组合框循环_C#_Wpf_Xaml - Fatal编程技术网

C# 重新加载时Wpf组合框循环

C# 重新加载时Wpf组合框循环,c#,wpf,xaml,C#,Wpf,Xaml,我有一个组合框: <ComboBox SelectedValuePath="Key" DisplayMemberPath="Value.ModuleName" controls:TextBoxHelper.Watermark="All" Height="2" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Modules}" commands:PropertyC

我有一个组合框:

<ComboBox 
    SelectedValuePath="Key" 
    DisplayMemberPath="Value.ModuleName" 
    controls:TextBoxHelper.Watermark="All" 
    Height="2" IsSynchronizedWithCurrentItem="True" 
    ItemsSource="{Binding Modules}" 
    commands:PropertyChangeBehavior.Command="{Binding ModuleCommand}" 
    SelectedValue="{Binding SelectedModule, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
    >
基本上逻辑很简单,但有一刻我清除了那个控件并用新数据填充它,问题是它陷入了无限循环,例如我从组合框中选择项,命令触发执行代码并用新数据重新填充组合框,所以新数据触发命令等等

有没有办法解决这个问题

抱歉,物品来源是:

    private Dictionary<string, ModulesModel> modules;
    public Dictionary<string, ModulesModel> Modules
    {
        get => modules;
        set
        {
            modules = value;
            OnPropertyChanged();
        }
    }
我假设VM的Modules属性是一个ObservableCollection。解决此问题的简单方法是在更新其内容之前检查新数据是否相同,很可能就是这样。 但我会深入研究语义,并试图理解为什么项目选择会触发数据更新。通常你不需要它

更新:

这是我之前提出的建议,如何打破循环

private Dictionary<string, ModulesModel> modules;
public Dictionary<string, ModulesModel> Modules
{
    get => modules;
    set
    {
        if (!AreEqual(modules, value))
        {
            modules = value;
            OnPropertyChanged();
        }
    }
}

我们可以看到c代码吗?您只能手动检查值是由您设置的还是由用户设置的。在执行重新填充之前,将某个字段设置为true,并在命令中检查该值,以便在该字段为true时不会执行。重新填充后,将该字段设置为false…有一刻我正在清除该控件并用新数据填充它。这段代码在哪里?Dictionary不是可观察的,请使用ObservableDictionary,然后您将希望确保已在ViewModel上正确实现INotifyPropertyChanged,一旦实现,则当ObservableCollection更新时,更改将通过数据绑定反映在UI组合框中。您不应该硬编码“清除并填充”组合框基本上逻辑很简单。说basic和/或simple并不能告诉读者你的代码实际上做了什么。
static bool AreEqual<T1, T2>(Dictionary<T1, T2> left, Dictionary<T1, T2> right) =>
    left?.Count == right?.Count &&
    left != null &&
    (Enumerable.SequenceEqual(left.Keys, right.Keys) &&
    Enumerable.SequenceEqual(left.Values, right.Values));