2013-10-24 2 views
0

У меня есть wpf datagrid с меткой в ​​datatemplate. Я хочу привязать цвет текста к свойству, и он не работает.Как связать цвет переднего плана ярлыка в datagrid?

Это xaml.

<DataGrid x:Name="ResultsDataGrid" CanUserSortColumns="True" MouseDown="ResultsDataGrid_OnMouseDown" SelectionChanged="ResultsDataGrid_OnSelectionChanged" 
IsReadOnly="False" AlternatingRowBackground="WhiteSmoke" CanUserAddRows="False" Margin="10" AutoGenerateColumns="False" VerticalAlignment="Stretch"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Header="Test ID" Width="150" IsReadOnly="True" SortMemberPath="TestDate"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Label Foreground="{Binding PassedColor}" Content="{Binding TestID}"></Label> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

И вот собственность.

public Brush PassedColor 
{ 
    get 
    { 
     return new SolidBrush(Color.Red); 
    } 
} 

Я не могу понять, что я делаю неправильно.

Если он снимает привязку и устанавливает передний план на red, он работает. Так что это определенно что-то с привязкой.

Edit:

Вот весь объект

public class LabelInfo : INotifyPropertyChanged 
{ 
    private bool _isSelected; 
    private double? _karat; 
    private bool _passed; 
    public string TestID { get; set; } 
    public string Label1 { get; set; } 
    public string Label2 { get; set; } 
    public string Value1 { get; set; } 
    public string Value2 { get; set; } 
    public string HasPassed { get { return Passed ? "Yes" : "No"; } } 

    public Brush PassColor 
    { 
     get 
     { 
      return Brushes.Red; 
     } 
    } 

    public bool Passed 
    { 
     get { return _passed; } 
     set 
     { 
      _passed = value; 
      NotifyPropertyChanged(); 
     } 
    } 

    public bool Final { get; set; } 
    public DateTime? TestDate { get; set; } 
    public Double RealTime { get; set; } 
    public string JTVID { get; set; } 
    public int AnalysisID { get; set; } 
    public List<ElementResults> Elements { get; set; } 
    public double Karat 
    { 
     get 
     { 
      if (_karat == null) 
       _karat = CalculateKarat(); 
      return _karat.Value; 
     } 
     set { _karat = value; } 
    } 

    public bool PlatingAlert 
    { 
     get 
     { 
      return Karat < 7.5; 
     } 
    } 

    public bool IsSelected 
    { 
     get { return _isSelected; } 
     set { _isSelected = value; NotifyPropertyChanged(); } 
    } 

    public bool PotentialCoating { get; set; } 

    private double CalculateKarat() 
    { 
     if (Elements == null || Elements.Count == 0) return 0; 
     return Elements.Where(ex => ex.Name.ToLower().Trim() == "au").Select(ex => ex.Level).FirstOrDefault(); 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
+0

Я уверен, что вам понадобится «DataContextSpy», см. Эту ссылку здесь: http://stackoverflow.com/questions/5046436/wpf-datagrid-databinding-column-to-pages-viewmodel Проблема в том, что это не часть визуального дерева, поэтому вы не можете получить доступ к привязке. – gleng

+0

Помимо 'DataContext' вам нужно использовать интерфейс INoifyPropertyChanged. Но, IMHO, я буду использовать ResourceDictionary для этого. – Tico

+1

@Tico Вам нужно будет сделать это, только если вам действительно нужен механизм уведомления об изменении свойств. Здесь не проблема. – Clemens

ответ

3

Вы используете System.Drawing.Brush, который из WinForms, но вы должны использовать WPF System.Windows.Media.Brush. Измените код следующим образом:

using System.Windows.Media; 

public Brush PassedColor 
{ 
    get { return new SolidColorBrush(Colors.Red); } 
} 

или

public Brush PassedColor 
{ 
    get { return Brushes.Red; } 
} 

Возможно удалить System.Drawing из ссылочных сборок. Тогда вы сразу же найдете все эти недостатки.

+0

Хм, нет. Я изменил его, чтобы вернуть цвет вместо кисти, но все равно не повезло. Но я думаю, что ты на правильном пути. Я буду продолжать играть с ним. – Smeegs

+0

Не возвращайте цвет, верните 'System.Windows.Media.Brush' вместо' System.Drawing.Brush'. – Clemens

+0

Еще ничего. Я буду играть с изменением надписи на этикетке в коде и посмотреть, смогу ли я заставить его работать за пределами сетки. – Smeegs

Смежные вопросы