2010-07-08 16 views
8

Değer < 0 olduğunda Kırmızı'yı ayarlamak için bir stil/tetikleyici oluşturmanın en iyi yolunu bulmaya çalışıyorum. Bunu yapmanın en iyi yolu nedir? DataTrigger'i kabul ediyorum, ama negatif değeri nasıl kontrol edebilirim, kendi IValueConverter'imi yaratmalı mıyım?WPF TextBlock Negatif Sayı Kırmızı Kırmızı

cevap

14

Eğer bir MVVM modeli kullanmıyorsanız (bir ForegroundColor özelliğiniz olabilir), o zaman yapmanız gereken en kolay şey, arka planınızı değerinize bağlamak için yeni bir IValueConverter oluşturmaktır. MyWindow.xaml yılında

:

<Window ... 
    xmlns:local="clr-namespace:MyLocalNamespace"> 
    <Window.Resources> 
     <local:ValueToForegroundColorConverter x:Key="valueToForeground" /> 
    <Window.Resources> 

    <TextBlock Text="{Binding MyValue}" 
       Foreground="{Binding MyValue, Converter={StaticResource valueToForeground}}" /> 
</Window> 

ValueToForegroundColorConverter.cs

using System; 
using System.Windows.Media; 
using System.Windows.Data; 

namespace MyLocalNamespace 
{ 
    class ValueToForegroundColorConverter: IValueConverter 
    { 
     #region IValueConverter Members 

     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      SolidColorBrush brush = new SolidColorBrush(Colors.Black); 

      Double doubleValue = 0.0; 
      Double.TryParse(value.ToString(), out doubleValue); 

      if (doubleValue < 0) 
       brush = new SolidColorBrush(Colors.Red); 

      return brush; 
     } 

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

     #endregion 
    } 
} 
+0

Bu çalışacak>

< Setter Mülkiyet: Amsakanna en çözüm için

<TextBlock Text="{Binding MyValue}"> <TextBlock.Style> <Style> <Style.Triggers> <DataTrigger Binding="{Binding IsMyValueNegative}" Value="True"> <Setter Property="Foreground" Value="Red" /> </DataTrigger> </Style.Triggers> </Style> </TextBlock.Style> </TextBlock> 

+2

@LnDCobra: MVVM ile çalışacaktır. Wonko'nun düsündügü, MVVM ile bir ValueConverter kullanmak yerine viewmodelinizdeki bir ForegroundColor özelligini ortaya çikarabileceksinizdir. –

+1

@Jakob: kesinlikle doğru. @LnDCobra: Önplan özelliği ile yukarıdaki gibi aynı ciltleme değerine ayarlanmış bir Stil uygulayabilirsiniz.

8

Sen ViewModel görünümünüzü belirli bilgiler. Ancak, ViewModel'deki Stil'e özgü bilgilerden kurtulabilirsiniz.

Dolayısıyla bool değeri

public bool IsMyValueNegative { get { return (MyValue < 0); } } 

dönmek Ve ValueConverter ve boks/unboxing ortadan kaldırabilir böylece DataTrigger bunu kullanmak istiyorsunuz ViewModel bir özelliği oluşturun. = "TextBlock .Foreground" Değer = "Kırmızı"/

+0

Bunun olacağını kabul etti Tercih edilir. Orijinal cevap, MVVM kullandığını söylemediğinden ve onun (benim için) ima etmediğinden kaynaklanıyor. –

+0

Bu işe yarar, ama bunu yapmak istemiyorum, çünkü her TextBlock için her bir textblock için ayrı bir özelliğe ihtiyaç duyarım (her defasında 10+). –

+0

Adlandırma kuralları hakkında sadece küçük bir nokta .. Uygulamalarım Bu tür bir xaml hack ile bu kadar dolu olsun. i.e: public bool DisplayBasketValueInRed {get; set; }. Ayrıca, bu özelliklerde INOTifyPropertyChanged öğesinin nasıl uygulanacağını azaltmak için genel bir sınıf (muhtemelen olmamalıdır) kullanıyorum. –

4

Ben Mülkiyet Setter bir sınıf adını eklemek zorunda Her ne kadar bir çeşit stil yaratmayı tercih etsem de (yeniden kolaylaştırma), bu neden MVVM ile çalışmaz?
+0

bana da uygulanabilecek bir genel (döküm gönderen) DataContextChanged olayı yazınız !. Teşekkürler! – tzippy

İlgili konular