我有一个组合框:
<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}"
>
基本上逻辑很简单,但有一刻我正在清除那个控件并用新数据填充它,问题是它属于无限循环,例如我从组合框中选择项目,命令fires执行代码并重新填充组合框新数据,所以新数据发出命令等等。
有没有办法解决这个问题。
道歉,物品来源是:
private Dictionary<string, ModulesModel> modules;
public Dictionary<string, ModulesModel> Modules
{
get => modules;
set
{
modules = value;
OnPropertyChanged();
}
}
答案 0 :(得分:1)
我认为,VM的Modules
属性是ObservableCollection
。解决问题的简单方法是在更新其内容之前检查新数据是否相同(这很可能就是这种情况)。
但我会更深入地研究语义并尝试理解为什么项目选择会触发数据更新。通常你不需要它。
更新
这是我之前建议的,你如何打破循环。
private Dictionary<string, ModulesModel> modules;
public Dictionary<string, ModulesModel> Modules
{
get => modules;
set
{
if (!AreEqual(modules, value))
{
modules = value;
OnPropertyChanged();
}
}
}
AreEqual
的实施可以是smth。像这样:
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));