2016-06-20 100 views
-1

我无法将来自后面的代码的颜色绑定到在XAML中定义为资源的颜色。 该绑定对于文本(又名消息)工作正常,但我无法完成XAML中定义的颜色。 这里是我正在使用的精简代码。如何从后面的代码绑定到XAML资源颜色

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> 

背后的代码:

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

在这里看到:http://stackoverflow.com/q/13262037/1136211 – Clemens

+0

我以前看过这篇文章,但它是关于dynamicaly创建资源。这是一种不同的方法。 – thowa

回答

0

创建一个新的属性称为BackgroundBrush,并使用此代码添加到您的字符串转换为刷:

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

使用绑定关键字绑定到它(不需要以静态资源):

{Binding BackgroundBrush} 
1

只需绑定你BackgroundBrush属性。

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

,改变你的String物业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

我其实希望在某处预定刷子,而不是为每条线创建新的。因为我不想降低性能。 – thowa

+0

@thowa你不需要为每一行创建一个新的SolidColorBrush。而是重用刷机实例。当两行应具有相同的颜色时,将相同的SolidColorBrush实例分配给其背景属性。除此之外,你仍然可以将它们定义为资源,并在'(Brush)Resources [“BlueBrush”]后面的代码中加入它们。通过视图模型属性引用Brush实例不会比为其资源键持有字符串花费更多。 – Clemens

相关问题