问题描述
我有一个绑定到列表框的 ObservableCollection 和一个绑定到按钮的 boolean 属性.然后,我定义了两个转换器,一个转换器在集合上运行,另一个转换器在布尔属性上运行.每当我修改boolean属性时,就会调用转换器的 Convert 方法,而如果我修改了observable集合,则不会调用该方法.我想念什么?
I have an ObservableCollection bound to a list box and a boolean property bound to a button. I then defined two converters, one that operates on the collection and the other operates on the boolean property. Whenever I modify the boolean property, the converter's Convert method is called, where as the same is not called if I modify the observable collection. What am I missing??
摘要供您参考
xaml片段,
<Window.Resources>
<local:WrapPanelWidthConverter x:Key="WrapPanelWidthConverter" />
<local:StateToColorConverter x:Key="StateToColorConverter" />
</Window.Resources>
<StackPanel>
<ListBox x:Name="NamesListBox" ItemsSource="{Binding Path=Names}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel x:Name="ItemWrapPanel" Width="500" Background="Gray">
<WrapPanel.RenderTransform>
<TranslateTransform x:Name="WrapPanelTranslatation" X="0" />
</WrapPanel.RenderTransform>
<WrapPanel.Triggers>
<EventTrigger RoutedEvent="WrapPanel.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="WrapPanelTranslatation" Storyboard.TargetProperty="X" To="{Binding Path=Names,Converter={StaticResource WrapPanelWidthConverter}}" From="525" Duration="0:0:2" RepeatBehavior="100" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</WrapPanel.Triggers>
</WrapPanel>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Label Content="{Binding}" Width="50" Background="LightGray" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button Content="{Binding Path=State}" Background="{Binding Path=State, Converter={StaticResource StateToColorConverter}}" Width="100" Height="100" Click="Button_Click" />
</StackPanel>
代码段后面的代码
public class WrapPanelWidthConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
ObservableCollection<string> aNames = value as ObservableCollection<string>;
return -(aNames.Count * 50);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class StateToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
bool aState = (bool)value;
if (aState)
return Brushes.Green;
else
return Brushes.Red;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
推荐答案
我认为,如果Binding
源已更新并通知该更新,则总是调用Binding
中的转换器. (作为DependencyProperty
或使用INotifyPropertyChanged
).但是,如果已添加或删除项目,则ObservableCollection
不会引发PropertyChanged
事件,但是会引发 CollectionChanged
事件.如果更改集合中的项目,则根本不会引发任何事件.即使项目本身提高了PropertyChanged
,也不会更新集合上的Binding
,因为Binding
源不是项目,而是集合.
I think the converter in a Binding
is always called if the Binding
source has been updated and notifies about that update (as a DependencyProperty
or using INotifyPropertyChanged
). However, an ObservableCollection
does not raise the PropertyChanged
event if an item has been added or removed, but it raises the CollectionChanged
event. It does not raise any event at all if an item in the collection is changed. Even if the item itself raises PropertyChanged
, this will not update the Binding
on the collection since the Binding
source is not the item, but the collection.
我担心您的方法将无法以这种方式工作.您可以直接绑定到ObservableCollection.Count
并向其添加适当的数学转换器以执行求逆和乘法,但是Count
属性不执行更改通知,因此没有此选项.我认为您必须在ViewModel或代码隐藏中提供另一个属性来处理这些情况...
I fear your approach will not work this way. You could bind directly to ObservableCollection.Count
and add an appropriate math converter to it to perform the inversion and multiplication, but the Count
property does not perform change notification, so this no option. I think you will have to provide another property in your ViewModel or code-behind which handles these cases...
这篇关于什么时候在wpf中调用ValueConverter的Convert方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!