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