Ho un ObservableCollection legato a una casella di lista e un valore booleano proprietà legato a un pulsante . Ho quindi definito due convertitori, uno che opera sulla raccolta e l'altro opera sulla proprietà booleana. Ogni volta che modifico la proprietà booleana, viene chiamato il metodo Convert del convertitore, dove lo stesso non viene chiamato se modifico la raccolta osservabile. Cosa mi manca ??Quando sarà il metodo Convert del ValueConverter essere chiamato in WPF
Frammenti per il vostro riferimento,
XAML snipet,
codice<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>
dietro frammento
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();
}
}
Ogni volta che un elemento viene aggiunto alla raccolta, il membro ObservableCollection è alzando CollectionModified evento. Dove i convertitori vengono attivati solo quando la proprietà viene modificata. Come soluzione alternativa, è possibile sottoscrivere l'evento modificato della raccolta e quindi generare l'evento PropertyChanged con il nome della proprietà ObservableCollection. – sudarsanyes
Proprio ora ho trovato la tua risposta e anch'io ho dedotto lo stesso. – sudarsanyes
La soluzione alternativa potrebbe funzionare, ma è necessario tenere presente che questa soluzione alternativa aggiornerà l'associazione completa, ovvero la raccolta verrà letta di nuovo e tutti gli elementi della raccolta verranno creati nuovamente. Almeno, questo è quello che mi aspetterei. Preferisco raccomandare il binding a una proprietà 'Count' personalizzata, ma dipende dal tuo scenario se vale la pena. – gehho