2012-03-26 18 views
0

Zur Zeit i ein Balkendiagramm aus einem listbox aus diesem Beispiel gemacht haben: http://weblogs.thinktecture.com/cnagel/2011/06/wpf-listbox-as-bar-chart.htmländern

Was ich tun möchte, ist die Farbe der Balken zu ändern. Mein Diagramm hat 5 Balken und jeder muss eine andere Farbe haben. Grundsätzlich möchte ich die Füllung des Rechtecks ​​ändern.

EDIT: Die Items scheinen nicht mehr, jeden Inhalt zu bekommen und mein Diagramm ist unsichtbar.

 public class GrafiekBar : INotifyPropertyChanged 
{ 
    private int value; 
    private Brush fill = Brushes.Blue; 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

    public List<GrafiekBar> GetDataGrafiek() 
    { 
     int[] getallen = new int[] { 3, 5, 8, 6, 2 }; 
     List<GrafiekBar> list = new List<GrafiekBar>(); 

     for (int i = 0; i < getallen.Length; i++) 
     { 
      GrafiekBar bar = new GrafiekBar(); 
      bar.Value = getallen[i]; 
      bar.Fill = Brushes.Blue; 
      list.Add(bar); 
     } 

     return list; 
    } 

    /// <summary> 
    /// Implement INotifyPropertyChanged in properties 
    /// http://msdn.microsoft.com/en-us/library/ms229614.aspx 
    /// </summary> 
    public int Value 
    { 
     get { return this.value; } 

     set 
     { 
      if (value != this.value) 
      { 
       this.value = value; 
       NotifyPropertyChanged("Value"); 
      } 
     } 
    } 

    public Brush Fill 
    { 
     get { return this.fill; } 

     set 
     { 
      if (value != this.fill) 
      { 
       this.fill = value; 
       NotifyPropertyChanged("Fill"); 
      } 
     } 
    } 

} 

XAML:

<ObjectDataProvider x:Key="odpLbGrafiek" ObjectType="{x:Type myClasses:GrafiekBar}" MethodName="GetDataGrafiek"/> 
    <ObjectDataProvider x:Key="odpLbGrafiekColors" ObjectType="{x:Type myClasses:GrafiekBar}" MethodName="Fill"/> 


<DataTemplate x:Key="GrafiekItemTemplate"> 
     <Border Width="Auto" Height="Auto"> 
      <Grid> 
       <Rectangle x:Name="recGrafiek" Fill="{Binding Source={StaticResource odpLbGrafiekColors}}" StrokeThickness="0" 
        Height="45" Width="{Binding}" Margin="13.2" 
        HorizontalAlignment="Right" VerticalAlignment="Bottom"> 
        <Rectangle.LayoutTransform> 
         <ScaleTransform ScaleX="20" /> 
        </Rectangle.LayoutTransform> 
       </Rectangle> 
      </Grid> 
     </Border> 
    </DataTemplate> 


<ItemsControl x:Name="icGrafiek" 
       Margin="0" 
       ItemsSource="{Binding Source={StaticResource odpLbGrafiek}}" 
       ItemTemplate="{DynamicResource GrafiekItemTemplate}" 
       Grid.RowSpan="5" 
       Grid.Column="1" Background="{x:Null}" HorizontalAlignment="Left" RenderTransformOrigin="0.5,0.5" 
       > 
      <ItemsControl.RenderTransform> 
       <TransformGroup> 
        <ScaleTransform/> 
        <SkewTransform/> 
        <RotateTransform Angle="180"/> 
        <TranslateTransform/> 
       </TransformGroup> 
      </ItemsControl.RenderTransform> 
     </ItemsControl> 

Mit freundlichen Grüßen.

+1

Sie sollten eine 'Liste ' zurückgeben, * erstellen * Sie keine UIElements im Code hinterher, die 'ListBox' erstellt die' ListBoxItems 'für Sie, auch wenn Sie' ListBoxItems' zurückgeben, wird 'ItemTemplate' * ignoriert *, Sie sollten [Binding errors] (http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30) sehen /debugging-data-bindings-in-a-wpf-or-silverlight-application.aspx). –

+0

Meine Liste scheint jetzt nicht mit den Werten zu aktualisieren? Eine zweite Änderung durchgeführt, die die Methode auflistet, die das itemsControl füllt. Aber der XAML-Parse-Fehler ist in der Tat jetzt weg, obwohl mein Diagramm jetzt leer bleibt. Grüße Rakr – Rakr

+1

Hast du einen Standardwert für 'Fill' festgelegt? Wenn Sie dies nicht tun, werden Sie nichts sehen, da die 'Füllung' der' Rechtecke' 'null' ist. –

Antwort

1

Sie sollten direkte Interaktion mit den Steuerelementen vermeiden, die für Templating verwendet werden, stattdessen bind alles, was Sie zu Ihrem Element ändern müssen, bearbeiten Sie dann die betreffende Eigenschaft auf dem Element.

Statt nur die Werte verwenden, müssen Sie eine Sammlung von komplexeren Objekten, zumindest müssen sie zwei Eigenschaften:

public class Bar : INotifyPropertyChanged 
{ 
    public double Value { get; set; } // Implement interface in those properties for binding 
    public Brush Fill { get; set; } 
} 

(Implementing INPC)

<!-- in the template --> 
<Rectangle Width="{Binding Value}" Fill="{Binding Fill}" .../> 
var bar = (Bar)lbGrafiek.Items.CurrentItem; 
bar.Fill = Brushes.Red; 
+0

Kannst du etwas weiter erklären, was du mit Code genau meinst? Weil es scheint, dass ich versuche, dieses Problem auf völlig falsche Weise zu lösen. Vielen Dank. – Rakr

+2

@Rakr: Ein Beispiel hinzugefügt –

+0

Dank H.B. Ich werde mir diesen neuen Ansatz ansehen. – Rakr