枚举属性不会跨集合视图更新

本文关键字:集合 视图 更新 属性 枚举 | 更新日期: 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()
    }
}