2011-05-29 21 views
5

पृष्ठभूमि के आधार पर।WPF डेटाग्रिड सेल रंग पूर्व सेल मूल्य

मैं एक स्टॉक ट्रेडिंग एप्लिकेशन विकसित कर रहा हूं। जो स्पष्ट रूप से बाजार की घड़ी है। मैं Datagrid का उपयोग कर इस बाजार घड़ी को विकसित कर रहा हूं।

ग्रिड क्या करता है? यह एक स्टॉक के मूल्य बिंदु प्रदर्शित करता है। प्रत्येक बार जब स्टॉक मूल्य बढ़ता है तो विशेष सेल फोरग्राउंड हरा बदल जाता है यदि यह घटता है तो यह लाल हो जाता है।

मैंने क्या किया? मैंने मूल्य कनवर्टर विधि और मल्टीबाइंडिंग

समस्या का उपयोग करने का प्रयास किया। मूल्य कनवर्टर केवल वर्तमान मूल्य देता है। मैं उस कनवर्टर को पुराना मान कैसे पास कर सकता हूं।

कोड:

<wpfTlKit:DataGrid.CellStyle> 
      <Style TargetType="{x:Type wpfTlKit:DataGridCell}"> 
       <Setter Property="Background"> 
        <Setter.Value> 
         <MultiBinding Converter="{StaticResource myHighlighterConverter}" 
             > 
          <MultiBinding.Bindings> 
           <Binding RelativeSource="{RelativeSource Self}"></Binding> 
           <Binding Path="Row" Mode="OneWay"></Binding> 
           <Binding ElementName="OldData" Path="Rows"></Binding> 
          </MultiBinding.Bindings> 
         </MultiBinding> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </wpfTlKit:DataGrid.CellStyle> 

कनवर्टर

public class HighlighterConverter : IMultiValueConverter 
{ 
    #region Implementation of IMultiValueConverter 

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (values[1] is DataRow) 
     { 
      //Change the background of any cell with 1.0 to light red. 
      var cell = (DataGridCell)values[0]; 
      var row = (DataRow)values[1]; 
      var columnName = cell.Column.SortMemberPath; 

      if (row[columnName].IsNumeric() && row[columnName].ToDouble() == 1.0) 
       return new SolidColorBrush(Colors.LightSalmon); 

     } 
     return SystemColors.AppWorkspaceColor; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new System.NotImplementedException(); 
    } 

    #endregion 
} 

public static class Extensions 
{ 
    public static bool IsNumeric(this object val) 
    { 
     double test; 
     return double.TryParse(val.ToString(), out test); 
    } 

    public static double ToDouble(this object val) 
    { 
     return Convert.ToDouble(val); 
    } 
} 

उत्तर

-1

अच्छी तरह से मुझे लगता है कि समस्या datagrid नहीं है, लेकिन वस्तु आप के लिए बाध्य। यदि आप एक डाटाटेबल से जुड़ते हैं तो पुराने डेटा (DataRowVersion) में बनाए जाते हैं। यदि आपके पास अन्य इकाई वस्तुएं हैं, तो इन इकाइयों को मूल और संशोधित मानों का समर्थन करने की आवश्यकता है।

+0

धन्यवाद, लेकिन तुम मुझे एक उदाहरण के साथ प्रदान कर सकते हैं। डब्ल्यूपीएफ के लिए नया होने के नाते मैं समझ नहीं पा रहा हूं कि डेटाग्रिड को ऑब्जेक्ट कैसे बाध्य करें। – Megatron

+0

मुझे नहीं लगता कि 'DataRowVersion' समाधान है। यह तब उपयोगी होता है जब आपको डेटाबेस और स्थानीय संशोधित संस्करण से प्राप्त संस्करण तक पहुंच की आवश्यकता होती है। ओपी चाहता है डेटाबेस से पुराना मूल्य और डेटाबेस से नया मूल्य है। – svick

3

एक डेटा ग्रिड सेल की रंग मैं निम्नलिखित की सिफारिश बदलने के लिए:

बिल्ड एक मॉडल है कि INotifyPropertyChanged लागू करता है कि वर्तमान में शामिल है, और पिछले कीमत के साथ साथ एक संपत्ति है कि मूल्य में परिवर्तन को दर्शाता है (मैंने संलग्न किया है इस उत्तर के अंत में पूरा मॉडल)।

public double ChangeInPrice 
{ 
    get 
    { 
    return CurrentPrice - PreviousPrice; 
    } 
} 

और कनवर्टर का उपयोग करके मूल्य में परिवर्तन के आधार पर अपने डेटाग्रिड में सेल टेम्पलेट की पृष्ठभूमि सेट करें। नोट: INotifyPropertyChanged मूल्य मान बदलते समय सेल के रंग को बदलने में मदद करता है।

<DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
    <TextBlock 
     Text="{Binding Path=CurrentPrice}" 
     Background="{Binding Path=ChangeInPrice, Converter={StaticResource backgroundConverter}}" > 
    </TextBlock> 
    </DataTemplate> 
</DataGridTemplateColumn.CellTemplate> 


[ValueConversion(typeof(object), typeof(SolidBrush))] 
public class ObjectToBackgroundConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
    SolidColorBrush b = Brushes.White; 

    try 
    { 
     double stock = (double)value; 
     if (stock > 0) 
     { 
     b = Brushes.Green; 
     } 
     else if (stock < 0) 
     { 
     b = Brushes.Red; 
     } 
    } 
    catch (Exception e) 
    { 
    } 

    return b; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
    throw new NotImplementedException(); 
    } 
} 

यहाँ संपूर्णता के लिए पूर्ण मॉडल है:

public class Stock : INotifyPropertyChanged 
{ 
    public Stock(string stockName, double currentPrice, double previousPrice) 
    { 
    this.StockName = stockName; 
    this.CurrentPrice = currentPrice; 
    this.PreviousPrice = previousPrice; 
    } 

    private string _stockName; 
    public String StockName 
    { 
    get { return _stockName; } 
    set 
    { 
     _stockName = value; 
     OnPropertyChanged("StockName"); 
    } 
    } 

    private double _currentPrice = 0.00; 
    public double CurrentPrice 
    { 
    get { return _currentPrice; } 
    set 
    { 
     _currentPrice = value; 
     OnPropertyChanged("CurrentPrice"); 
     OnPropertyChanged("ChangeInPrice"); 
    } 
    } 

    private double _previousPrice = 0.00; 
    public double PreviousPrice 
    { 
    get { return _previousPrice; } 
    set 
    { 
     _previousPrice = value; 
     OnPropertyChanged("PreviousPrice"); 
     OnPropertyChanged("ChangeInPrice"); 
    } 
    } 

    public double ChangeInPrice 
    { 
    get 
    { 
     return CurrentPrice - PreviousPrice; 
    } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string propertyName) 
    { 
    PropertyChangedEventHandler handler = PropertyChanged; 

    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    } 
} 
संबंधित मुद्दे