枚举属性不会跨集合视图更新
本文关键字:集合 视图 更新 属性 枚举 | 更新日期: 2023-09-27 17:57:10
我有一个类,"MainViewModel",它包括一个ColorMappingViewModel的可观察集合,并引用了另外两个ViewModels,一个用于更新ColorMappingViewModels(ColorControllerViewModel),另一个包含一个CollectionView,用于显示这些ColorMappingViewModels的特定子集(ColorSelectionViewModel)。这两个类都传递了要绑定到的 ObservableCollection。
ColorMappingViewModel 有两个属性:颜色和类型。
public class ColourMappingViewModel : ViewModel,
{
public Color TextColour
{
get
{
return (Color)ColorConverter.ConvertFromString(_colourMapping.TextColour);
}
set
{
_colourMapping.TextColour = value.ToString().Remove(1, 2);
OnPropertyChanged();
}
}
public ColourMappingUsageType Type
{
get
{
return _colourMapping.Usage;
}
set
{
_colourMapping.Usage = value;
OnPropertyChanged()
}
}
}
ColorController 包含一个 DataGrid,其中 Type 列包含一个 ComboBox,它绑定到枚举类型的集合和 "Type" 属性,如下所示:
ItemsSource="{Binding Types, Mode=OneWay}"
SelectedValue="{Binding Type, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
类似地,另一个包含 ColorList 的组合框,绑定如下:
ItemsSource="{Binding DataContext.ColoursList,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type view:ColourController}}}"
SelectedItem="{Binding BackgroundColour, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
ColorSelectionViewModel 上的 CollectionView 根据"Type"的值过滤列表,我的 ColorSelect 视图上还有另一个绑定到此 CollectionView 的组合框。
现在。如果我在颜色控制器中更新"文本颜色",这将反映在颜色选择器中 - 我可以看到更改。
但是,如果我更新"类型",由于"OnPropertyChanged()"被反复调用,整个事情都会因StackOverflowException而失败。我的问题是,为什么!?
将代码更新为:
public Color TextColour
{
get
{
//it would be faster to convert in the set, not in the get
//get is called more often
return (Color)ColorConverter.ConvertFromString(_colourMapping.TextColour);
}
set
{
var converted = value.ToString().Remove(1, 2);
if (_colourMapping.TextColour == converted) return;
_colourMapping.TextColour = converted;
OnPropertyChanged();
}
}
public ColourMappingUsageType Type
{
get
{
return _colourMapping.Usage;
}
set
{
if (_colourMapping.Usage == value) return;
_colourMapping.Usage = value;
OnPropertyChanged()
}
}