Ich habe eine Window
Klasse, wo ich mehrere TextBlock
Elemente, die eine Background
Farbe durch einen Wert von Binding
Eigentum erhalten. Die erste "Converter-Anbindung" funktioniert einwandfrei und macht alles möglich. Heute habe ich versucht, einen anderen „Converter Bindung“ mit einem anderen Converter
dafür verwendet zu implementieren, aber es funktioniert nicht:WPF: ValueConverter (IValueConverter) funktioniert nicht
(ich die ConvertBack
Methoden verlassen, weil sie hier nicht erforderlich sind):
namespace InsightTool.Gui.Helper {
[ValueConversion(typeof(double), typeof(Brush))]
public class AverageExecutionTimeToColorConverter : IValueConverter {
public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
double val;
double.TryParse(value.ToString(), out val);
if (val >= 10000) {
return Brushes.Red;
} else if (val >= 5000) {
return Brushes.Orange;
} else {
return Brushes.Green;
}
}
}
[ValueConversion(typeof(int), typeof(Brush))]
public class ThreadsAvailableCountToColorConverter : IValueConverter {
public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
int val;
int.TryParse(value.ToString(), out val);
if (val < 100) {
return Brushes.Red;
} else if (val < 200) {
return Brushes.Orange;
} else if (val < 500) {
return Brushes.Yellow;
} else {
return Brushes.Green;
}
}
}
}
In I die Window
Klasse verwendet, um beide konvertiert, wie folgend:
<Window ...
x:Name="Main"
xmlns:Base="clr-namespace:InsightTool.Gui.Helper">
<Window.Resources>
<Base:ThreadsAvailableCountToColorConverter x:Key="ThreadsAvailableCntConverter"/>
<Base:AverageExecutionTimeToColorConverter x:Key="AvgExecutionTimeConverter"/>
</Window.Resources>
<!-- This one works fine-->
<TextBlock Width="10" Height="10" VerticalAlignment="Center" Background="{Binding ExecutionTimeAverage, Converter={StaticResource AvgExecutionTimeConverter}, ElementName=UCExecutionTimes}"/>
<!-- This one does not work-->
<TextBlock Width="10" Height="10" VerticalAlignment="Center" Background="{Binding ThreadsAvailableCount, Converter={StaticResource ThreadsAvailableCntConverter}, ElementName=Main}"/>
</Window>
Erklärung DependencyProperties
:
public partial class UserControlExecutionTimes : UserControl {
public static readonly DependencyProperty ExecutionTimeAverageProperty =
DependencyProperty.Register("ExecutionTimeAverage", typeof(double), typeof(MainWindow), new FrameworkPropertyMetadata(double));
public double ExecutionTimeAverage {
get { return (double)GetValue(ExecutionTimeAverageProperty); }
set { SetValue(ExecutionTimeAverageProperty, value); }
}
}
public partial class MainWindow : Window {
public static readonly DependencyProperty ThreadsAvailableCountProperty = DependencyProperty.Register("ThreadsAvailableCount", typeof(int),
typeof(MainWindow), new FrameworkPropertyMetadata(int));
public int ThreadsAvailableCount {
get { return (int)GetValue(ThreadsAvailableCountProperty); }
set { SetValue(ThreadsAvailableCountProperty, value); }
}
}
Beide DependencyProperties
sind korrekt eingestellt und ihre Werte werden in der GUI angezeigt. Was vermisse ich hier?
EDIT:
Getestet habe ich auch die folgenden:
<Window>
<!-- This one works fine-->
<TextBlock Width="10" Height="10" VerticalAlignment="Center" Background="{Binding ThreadsAvailableCount, Converter={StaticResource AvgExecutionTimeConverter}, ElementName=Main}"/>
<!-- This one does not work-->
<TextBlock Width="10" Height="10" VerticalAlignment="Center" Background="{Binding ThreadsAvailableCount, Converter={StaticResource ThreadsAvailableCntConverter}, ElementName=Main}"/>
</Window>
Es scheint, dass es ein Problem für die Binding
den Rückgabewert des „neuen“ Konverter zu verbrauchen, aber ich habe keine Ahnung warum.
EDIT2
Ich überprüfe die Bindungen mit Snoop und das Ergebnis wurde die folgende:
Die background
Eigenschaft des Arbeits Konverter Bindung sieht wie folgt aus:
Aber die background
Eigenschaft der nicht funktionierenden Konverterbindung sieht so aus:
Ein weiterer Beweis dafür, dass ThreadsAvailableCount
richtig eingestellt ist (Bindung an ein Textblock
):
es mehr und mehr scheint bei der Darstellung des Rückgabewertes der ThreadsAvailableCountToColorConverter
ein Fehler zu sein. Das liegt daran, dass es im Debug-Modus an einem Haltepunkt in der Convert
-Methode der ThreadsAvailableCountToColorConverter
stoppt. Es erreicht sogar return
in der Convert
Methode erfolgreich.
Haben Sie versucht, einen Haltepunkt in der Methode Konvertieren von ThreadsAvailableCountToColorConverter setzen zu sehen, ob es angerufen wird. –
@ R.Rusev Es wird aufgerufen. Ich habe das schon ausprobiert, aber die Hintergrundfarbe dieses Steuerelements bleibt nur weiß – rbr94
Gibt es irgendwelche Ausnahmen oder Bindungsfehler im Ausgabefenster des Debuggers? – haindl