2016-10-07 13 views
1

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: working_background_binding

Aber die background Eigenschaft der nicht funktionierenden Konverterbindung sieht so aus: not_working_background_binding

Ein weiterer Beweis dafür, dass ThreadsAvailableCount richtig eingestellt ist (Bindung an ein Textblock): content_binding

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.

+0

Haben Sie versucht, einen Haltepunkt in der Methode Konvertieren von ThreadsAvailableCountToColorConverter setzen zu sehen, ob es angerufen wird. –

+0

@ R.Rusev Es wird aufgerufen. Ich habe das schon ausprobiert, aber die Hintergrundfarbe dieses Steuerelements bleibt nur weiß – rbr94

+0

Gibt es irgendwelche Ausnahmen oder Bindungsfehler im Ausgabefenster des Debuggers? – haindl

Antwort

0

Ich denke, könnte mehrere Probleme sein Blick auf das 'Ausgabefenster' für die Bindung Ausdruck Fehler. 1) Stellen Sie sicher, dass die Textbox in separaten Bereichen gerendert wird und nicht überlappt. 2) Verwenden Sie den relativen Pfad, um zum Steuerelement zu gelangen, und verwenden Sie die Eigenschaft im Bindungsausdruck

Ihr Konverter sieht gut aus.

Nach meiner XAML ist

<Window x:Class="StackOverflowBinding.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:stackOverflowBinding="clr-namespace:StackOverflowBinding" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <stackOverflowBinding:ThreadsAvailableCountToColorConverter x:Key="ThreadsAvailableCntConverter"/> 
     <stackOverflowBinding:AverageExecutionTimeToColorConverter x:Key="AvgExecutionTimeConverter"/> 
    </Window.Resources> 
    <Grid> 
     <!--<DatePicker 
     x:Name="newtally" 
     Text="{Binding CustomerLastTally,Mode=TwoWay}" 
     Margin="0 0 0 0" 
     />--> 
     <!-- This one works fine--> 
     <Grid.RowDefinitions> 
      <RowDefinition></RowDefinition> 
      <RowDefinition></RowDefinition> 
      <RowDefinition></RowDefinition> 
     </Grid.RowDefinitions> 
     <TextBlock Grid.Row="0" Grid.Column="0" Width="30" Height="30" Text="Break"/> 
     <TextBlock Grid.Row="1" Grid.Column="0" Width="30" Height="30" VerticalAlignment="Center" Text="Break" Background="{Binding ExecutionTimeAverage, Converter={StaticResource AvgExecutionTimeConverter}, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/> 

     <!-- This one does not work--> 
     <TextBlock Grid.Row="2" Grid.Column="0" Width="30" Height="30" VerticalAlignment="Center" Text="Break" Background ="{Binding ThreadsAvailableCount, Converter={StaticResource ThreadsAvailableCntConverter}, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/> 
    </Grid> 

</Window> 

Es folgt mein Code hinter

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace StackOverflowBinding 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     // Dependency Property 
     public static readonly DependencyProperty ExecutionTimeAverageProperty = 
      DependencyProperty.Register("ExecutionTimeAverage", typeof(DateTime), 
      typeof(MainWindow), new FrameworkPropertyMetadata(DateTime.Now)); 

     // .NET Property wrapper 
     public DateTime ExecutionTimeAverage 
     { 
      get { return (DateTime)GetValue(ExecutionTimeAverageProperty); } 
      set { SetValue(ExecutionTimeAverageProperty, value); } 
     } 

     // Dependency Property 
     public static readonly DependencyProperty ThreadsAvailableCountProperty = 
      DependencyProperty.Register("ThreadsAvailableCount", typeof(int), 
      typeof(MainWindow), new FrameworkPropertyMetadata(40)); 

     // .NET Property wrapper 
     public int ThreadsAvailableCount 
     { 
      get { return (int)GetValue(ThreadsAvailableCountProperty); } 
      set { SetValue(ThreadsAvailableCountProperty, value); } 
     } 
    } 
} 

Nach meinem Konverter ist

using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Data; 
using System.Windows.Media; 

namespace StackOverflowBinding 
{ 

    [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; 
      } 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    [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; 
      } 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 
+0

Thx für Ihre Antwort, aber das löst das Problem nicht. – rbr94

+0

können Sie Dateien oder Projekt teilen, wie ich es getan habe? – aeje

+0

Was meinst du? Ich denke, ich habe den notwendigen Code für diese Frage geteilt – rbr94

Verwandte Themen