in wpf nennen Ich habe eine ObservableCollection zu einer Box Liste gebunden und boolean Eigenschaft auf einen gebunden Taste. Ich definierte dann zwei Konverter, einer, der auf der Sammlung arbeitet und der andere auf der booleschen Eigenschaft arbeitet. Immer wenn ich die boolesche Eigenschaft ändere, wird die Convert Methode des Converters aufgerufen, wobei das gleiche nicht aufgerufen wird, wenn ich die beobachtbare Sammlung modifiziere. Was vermisse ich??Wann wird die Methode Konvertieren des Valueconverter
Snippets für Ihre Referenz,
XAML snipet,
<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>
Code hinter Snippet
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();
}
}
Jedes Mal, wenn ein Element der Sammlung hinzugefügt wird, ist die ObservableCollection Mitglied CollectionModified Anhebung Veranstaltung. Wo die Konverter nur ausgelöst werden, wenn die Eigenschaft geändert wird. Um dieses Problem zu umgehen, können Sie das geänderte Sammlungsereignis abonnieren und dann das PropertyChanged-Ereignis mit dem Objeknamen der ObservableCollection auslösen. – sudarsanyes
Gerade ist jetzt auf Ihre Antwort gestoßen und ich habe auch das gleiche abgeleitet. – sudarsanyes
Ihre Problemumgehung kann funktionieren, aber Sie sollten sich bewusst sein, dass diese Problemumgehung wird die vollständige Bindung aktualisieren, das heißt die Sammlung lesen neu ist und alle Elemente in Ihrer Sammlung werden wieder angelegt. Zumindest würde ich das erwarten. Ich würde eher empfehlen, an eine benutzerdefinierte "Count" -Eigenschaft zu binden, aber es hängt von Ihrem Szenario ab, ob es den Overhead wert ist. – gehho