2016-06-20 20 views
-1

binden Ich habe Probleme mit der Bindung der Farbe von Code hinter einer Farbe als Ressource in XAML definiert. Die Bindung funktioniert gut für den Text (alias Nachricht), aber ich kann es nicht für die in XAML definierten Farben tun. Hier ist der abgespeckte Code, den ich benutze.Wie an XAML Ressourcenfarbe aus Code hinter

Die XAML:

<Window x:Class="WpfApplication3.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
     <SolidColorBrush x:Key="BlueBrush" Color="#FFCFEDFF" /> 
     <SolidColorBrush x:Key="GreenBrush" Color="#FFE5EFC8" /> 
</Window.Resources> 

<Grid> 
    <ListBox ItemsSource="{Binding List, ElementName=UI}" x:Name="listBox" > 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <Grid.Background> 
>>>       <SolidColorBrush Color="{StaticResource {Binding Path=Background}}"/> <<< Here is my problem <<< 
         </Grid.Background> 
        <TextBlock Text="{Binding Message}"/> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 
</Window> 

Der Code hinter:

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
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 WpfApplication3 
{ 
    public partial class MainWindow : Window 
    { 
     private ObservableCollection<Line> buffer; 

     public MainWindow() 
     { 
      InitializeComponent(); 
      buffer = new ObservableCollection<Line>(); 

      listBox.ItemsSource = buffer; 
      buffer.Add(new Line("Line1", "BlueBrush")); 
      buffer.Add(new Line("Line2", "GreenBrush")); 
     } 

     public class Line 
     { 
      private string _message; 
      private string _background; 

      public Line(String message, String background) 
      { 
       this._message = message; 
       this._background = background; 
      } 

      public string Message 
      { 
       get { return _message; } 
       set { _message = value; } 
      } 

      public string Background 
      { 
       get { return _background; } 
       set { _background = value; } 
      } 
     } 
    } 
} 
+0

Siehe hier: http://stackoverflow.com/q/13262037/1136211 – Clemens

+0

ich diesen Beitrag gesehen haben, aber es etwa dynamicaly schafft Ressourcen. Das ist ein anderer Ansatz. – thowa

Antwort

0

Erstellen Sie eine neue Eigenschaft namens BackgroundBrush und diesen Code verwenden Zeichenfolge zu Pinsel werfen:

public Brush BackgroundBrush => return (SolidColorBrush)new BrushConverter().ConvertFromString(this.Background); 

Bindung mit nur Binding-Schlüsselwort (keine Notwendigkeit zu Static):

{Binding BackgroundBrush} 
1

binden Sie Ihre Background auf ein Brush Property.

<Grid> 
    <ListBox ItemsSource="{Binding List, ElementName=UI}" x:Name="listBox" > 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Grid Background="{Binding Background}"> 
        <TextBlock Text="{Binding Message}"/> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

und ändern Sie Ihre String Eigentum zu Brush.

public partial class MainWindow : Window 
     { 
      public MainWindow() 
      { 
       InitializeComponent(); 
       buffer = new ObservableCollection<Line>(); 

       listBox.ItemsSource = buffer; 
       buffer.Add(new Line("Line1", new SolidColorBrush(Colors.Blue))); 
       buffer.Add(new Line("Line2", new SolidColorBrush(Colors.Green))); 
      } 
      private ObservableCollection<Line> buffer; 

      public class Line 
      { 
       private string _message; 
       private Brush _background; 

       public Line(String message, Brush background) 
       { 
        this._message = message; 
        this._background = background; 
       } 

       public string Message 
       { 
        get { return _message; } 
        set { _message = value; } 
       } 

       public Brush Background 
       { 
        get { return _background; } 
        set { _background = value; } 
       } 
      } 
     } 
+0

Ich wollte eigentlich das gebürstete vordefinierte irgendwo haben und nicht das neue für jede Zeile erstellen. Weil ich die Leistung nicht reduzieren möchte. – thowa

+0

@thowa Sie müssen für jede Linie keinen neuen SolidColorBrush erstellen. Verwenden Sie Brush-Instanzen stattdessen erneut. Wenn zwei Linien die gleiche Farbe haben sollen, weisen Sie ihrer Background-Eigenschaft dieselbe SolidColorBrush-Instanz zu. Abgesehen davon können Sie sie immer noch als Ressource definieren und sie in Code hinter "(Brush) Resources [" BlueBrush "]' hinterlegen. Das Referenzieren einer Brush-Instanz durch eine View-Modelleigenschaft kostet nicht mehr als das Halten einer Zeichenfolge für ihren Ressourcenschlüssel. – Clemens