2016-10-07 4 views
1

J'ai une classe Window, où j'ai plusieurs éléments TextBlock qui devraient recevoir une couleur Background d'une valeur d'une propriété Binding. Le premier "Convertisseur de liaison" fonctionne bien et fait tout ce que l'on attend. Aujourd'hui, j'ai essayé de mettre en œuvre une autre « Convertisseur de liaison » avec un autre Converter utilisé pour, mais il ne fonctionne pas:WPF: ValueConverter (IValueConverter) ne fonctionne pas

(je quittais les méthodes ConvertBack parce qu'ils ne sont pas nécessaires ici):

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

En I utilisé classe Window les deux convertis comme suit:

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

Déclaration de 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); } 
    } 
} 

Les deux DependencyProperties sont définis correctement et leurs valeurs sont affichées dans l'interface graphique. Qu'est-ce qui me manque ici?

EDIT:

J'ai aussi testé les éléments suivants:

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

Il semble qu'il y ait un problème pour le Binding à consommer la valeur de retour du convertisseur « nouveau », mais je aucune idée pourquoi.

EDIT2

Je vérifie les liaisons avec Snoop et le résultat a été la suivante:

La propriété background du look de liaison convertisseur de travail comme celui-ci: working_background_binding

Mais la background propriété de la liaison de convertisseur ne fonctionne pas ressemble à ceci: not_working_background_binding

Une autre preuve que ThreadsAvailableCount est correctement réglée (Reliure à Textblock): content_binding

plus en plus semble être une erreur dans l'affichage de la valeur de retour de la ThreadsAvailableCountToColorConverter. En effet, en mode débogage, il s'arrête à un point d'arrêt dans la méthode Convert du ThreadsAvailableCountToColorConverter. Il atteint même return dans la méthode Convert avec succès.

+0

Avez-vous essayé de mettre un point d'arrêt dans la méthode Convert de ThreadsAvailableCountToColorConverter à voir si ça s'appelle. –

+0

@ R.Rusev Il est appelé. J'ai déjà essayé, mais la couleur de fond de ce contrôle reste blanche – rbr94

+0

Existe-t-il des exceptions ou des erreurs de liaison dans la fenêtre de sortie du débogueur? – haindl

Répondre

0

Je pense que plusieurs problèmes peuvent se produire dans la 'fenêtre de sortie' pour les erreurs d'expression de liaison. 1) Assurez-vous que la zone de texte est affichée dans des zones distinctes et ne chevauche pas . 2) Utilisez le chemin relatif pour accéder au contrôle et utilisez la propriété dans l'expression de liaison

Votre convertisseur a l'air bien.

Ce qui suit est mon XAML

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

Après mon code derrière

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

Après mon convertisseur

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 pour votre réponse, mais cela ne résout pas le problème. – rbr94

+0

pouvez-vous partager vos fichiers ou projet comme je l'ai fait? – aeje

+0

Que voulez-vous dire? Je pense que j'ai partagé tout le code nécessaire pour cette question – rbr94