2013-10-24 2 views
0

데이터 형식의 레이블이있는 wpf DataGrid가 있습니다. 텍스트의 색상을 속성에 바인딩하고 싶습니다. 작동하지 않습니다.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으로 설정하면 작동합니다. 그래서 그것은 확실히 구속력있는 것입니다.

편집 : 여기

당신은 윈폼에서입니다 System.Drawing.Brush를 사용하는 전체 개체

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

,하지만 당신은 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

Color를 반환하지 않으면,'System.Drawing.Brush' 대신'System.Windows.Media.Brush'를 반환하십시오. – Clemens

+0

아직 아무것도 없습니다. 코드 전경에서 레이블 전경을 변경하고 먼저 그리드 외부에서 작업 할 수 있는지 알아 봅니다. – Smeegs

관련 문제