枚举属性未跨 CollectionViews 更新

Enum Properties not updating across CollectionViews

我有一个 class、"MainViewModel",其中包含一个 ColourMappingViewModel 的 Observable 集合,并引用了另外两个 ViewModel,一个用于更新 ColourMappingViewModel (ColourControllerViewModel),另一个用于包含一个 CollectionView,用于显示这些 ColourMappingViewModels (ColourSelectionViewModel) 的特定子集。这两个 classes 都通过 ObservableCollection 绑定到。

ColourMappingViewModel 有两个属性:颜色和类型。

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()
        }
    }

}

ColourController 包含一个 DataGrid,Type 列包含一个绑定到枚举类型集合的 ComboBox 和 "Type" 属性,如下所示:

  ItemsSource="{Binding Types, Mode=OneWay}"
  SelectedValue="{Binding Type, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 

同样,另一个包含 ColourList 的 ComboBox,绑定如下:

ItemsSource="{Binding DataContext.ColoursList,
             RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type view:ColourController}}}"
             SelectedItem="{Binding BackgroundColour, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

ColourSelectionViewModel 上的 CollectionView 根据 "Type" 的值过滤列表,我的 ColourSelection 视图上有另一个绑定到此 CollectionView 的 ComboBox。

现在。如果我更新 ColourController 中的 "TextColour",这会反映在 ColourSelector 中 - 我可以看到更改。

如果我更新 'Type',由于 "OnPropertyChanged()" 被重复调用,整个事情都会因 WhosebugException 而失败。我的问题是,为什么!?

将您的代码更新为:

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()
    }
}