枚举属性未跨 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()
}
}
我有一个 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()
}
}