【发布时间】:2019-11-16 06:48:05
【问题描述】:
我有一个列表框,其中包含消息,它们是简单的(typeEnum,字符串)对象,并使用数据模板显示:
<ListBox ItemsSource="{Binding Messages}"
Background="DimGray" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" >
<TextBlock Text="{Binding MessageText}" >
<TextBlock.Foreground>
<MultiBinding Converter="{StaticResource TypeEnumToBrushConverter}" >
<Binding Path="TypeEnum" />
<Binding Path="MessageColours" RelativeSource="{RelativeSource AncestorType={x:Type Window}}" />
</MultiBinding>
</TextBlock.Foreground>
</TextBlock>
<Button Click="ButtonBase_OnClick1" >T</Button>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我正在尝试将消息的前景设置为 MessageColours (TypeEnum - Brush 对的集合),我将其传递给转换器。
这适用于我手动添加到 MessageColours 的初始画笔。
我正在另一个窗口中更改它们,并且该集合已成功更新,但是 ListBox 消息颜色不会更新。 MessageColours 最初是一个 ObservableCollection MessageColourSettings (TypeEnum, Brush) 但我将其更改为实现 INotifyPropertyChanged 的实现,因此它也会在集合项中的属性发生更改时发出通知,但它没有帮助。
MessageColourSettings 实现了 INotifyPropertyChanged,当另一个窗口的颜色发生变化时它会被触发,并且 MessageColours 集合会触发它的项目属性发生变化。
当我单击该按钮时,它会将 typeEnum 从 A 切换到 B 再切换回 A,然后显示消息 现在有更新的颜色,所以我认为多重绑定有问题。
转换器:
public class TypeEnumToBrushConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
TypeEnum typeEnum = (TypeEnum) values[0];
var settings = values[1] as FullyObservableCollection<MessageColourSetting>;
return settings.Single(setting => setting.TypeEnum == typeEnum).Brush;
}
}
任何见解将不胜感激
【问题讨论】:
标签: wpf data-binding