2010-07-08 43 views
8

Tôi đang cố gắng tìm ra cách tốt nhất để tạo kiểu/kích hoạt để đặt nền trước thành Đỏ, khi giá trị là < 0. cách tốt nhất để làm điều này là gì? Tôi giả sử DataTrigger, nhưng làm thế nào tôi có thể kiểm tra giá trị âm, tôi có phải tạo IValueConverter của riêng mình không?WPF TextBlock số âm trong màu đỏ

Trả lời

14

Nếu bạn không sử dụng mô hình MVVM (nơi bạn có thể có thuộc tính ForegroundColor), thì việc dễ nhất là tạo một IValueConverter mới, gắn kết nền của bạn với giá trị của bạn.

Trong MyWindow.xaml:

<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

này sẽ làm việc , mặc dù tôi thà tạo ra một số kiểu phong cách (dễ dàng hơn để reimplement), tại sao điều này sẽ không làm việc với MVVM? –

+2

@LnDCobra: Nó sẽ hoạt động với MVVM. Những gì tôi nghĩ rằng Wonko có nghĩa là với MVVM bạn có thể chọn để lộ một tài sản ForegroundColor trên viewmodel của bạn thay vì sử dụng một ValueConverter. –

+1

@ Jakob: hoàn toàn chính xác. @LnDCobra: bạn có thể triển khai Kiểu, với giá trị của thuộc tính Foreground được đặt thành cùng một ràng buộc như trên.

8

Bạn nên có thông tin cụ thể xem bạn trong ViewModel của bạn. Nhưng bạn có thể loại bỏ thông tin cụ thể về Kiểu trong ViewModel.

Do đó tạo ra một tài sản trong ViewModel mà sẽ trả về một giá trị bool

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

Và sử dụng nó trong một DataTrigger để bạn có thể loại bỏ các ValueConverter và đấm bốc của nó/unboxing.

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

Đồng ý rằng điều này sẽ là thích hợp hơn. Câu trả lời ban đầu bắt nguồn từ thực tế là anh ta không đề cập đến việc anh ta đang sử dụng MVVM, và câu hỏi ngụ ý (với tôi) rằng anh ấy không phải. –

+0

Điều này sẽ hiệu quả, nhưng lý do tôi không muốn làm điều này, là vì mỗi TextBlock tôi sẽ cần một thuộc tính riêng cho mỗi textblock (10+ cho mỗi lần xem thường) –

+0

Chỉ một điểm nhỏ trên quy ước đặt tên. nhận được đầy đủ các loại xaml hack mà tôi tìm thấy nó allot dễ dàng hơn để đặt tên cho chúng theo mục đích. tức là: public bool DisplayBasketValueInRed {get; bộ; }. Tôi cũng sử dụng (mặc dù có lẽ không nên) một lớp học chung để giảm cách thực hiện verbose INotifyPropertyChanged trên các thuộc tính này có thể được. –

4

Đối với giải pháp Amsakanna của tôi đã có thêm một tên lớp để Setter tài sản:

< Setter tài sản = "TextBlock .Foreground" Value = "Red" />

+0

tôi nữa !. Cảm ơn! – tzippy

Các vấn đề liên quan