2015-09-09 28 views
1

如果我想在WPF改變Background -color一個Button的紅色,如果在我的視圖模型的財產Amount0和綠色的,如果它是大於0,豈不是更好爲此使用值轉換器,還是應該在我的視圖模型中簡單實現自定義的Background屬性?這Background -property會將Amount值 - 換成SolidColorBrush,它將綁定到ButtonBackground存儲在視圖模型信息或使用的IValueConverter

哪種方式更直接?

謝謝!

回答

4

我會使用DataTrigger

將以下樣式應用於您的按鈕。

它對視圖模型中的Amount屬性具有約束力。 它設置爲默認背景色,以「綠色」和改變「紅色」如果Amount值爲0

<Button.Style> 
    <Style TargetType="Button"> 
     <Setter Property="Background" Value="Green" /> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Amount}" Value="0"> 
       <Setter Property="Background" Value="Red" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Button.Style> 


其他信息

您還可以檢查使用MultiDataTrigger的多個代碼。

它看起來像這樣:

<MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
     <Condition Binding="{...}, Value="..."/> 
     <Condition Binding="{...}, Value="..."/> 
    </MultiDataTrigger.Conditions> 
    <MultiDataTrigger.Setters> 
     <Setter Property="A" Value="..."/> 
     <Setter Property="B" Value="..."/> 
    </MultiDataTrigger.Setters> 
</MultiDataTrigger> 

如何使用它退房this article

似乎對於範圍檢查,您需要實施IValueConverter,如其他響應中提到的或this answer中所述。

+0

如果紅色的條件爲假,它是否會設置爲綠色? – BendEg

+0

我剛測試過它,似乎工作。我有更改顏色的按鈕,我使用兩個按鈕將視圖模型中的Amount屬性設置爲0或5(只是其他值爲0),我可以看到該按鈕相應地更改其背景顏色。 – Martin

2

我會用觸發器做,但轉換器也沒問題。但我絕對不會在ViewModel中創建屬性背景,因爲背景是關於設計,關於視圖,所以最好在視圖中定義它

+0

好的,這是有道理的,謝謝! – BendEg

1

設置Buttonbackground東西視圖的關聯,我不件事,從視圖模型設置它是一個好主意,我認爲這是好多了,如果你定義的視圖模型的Amount屬性,定義DataTrigger使用轉換

<Window.Resources> 
    <YurNs:GreaterThanValConverter x:Key="GreaterThanValConverter"/> 
</Window.Resources> 
<StackPanel> 
    <TextBox Text="{Binding Amount,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> 
    <Button Content="Button"> 
     <Button.Style> 
      <Style TargetType="Button"> 
       <Setter Property="Background" Value="Green"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Amount,Converter={StaticResource GreaterThanValConverter}}" Value="false"> 
         <Setter Property="Background" Value="Red"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Button.Style> 
    </Button>  
</StackPanel> 

和轉換器來檢查amount值反對

public class GreaterThanValConverter:IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return (int) value > 0; 
    } 

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

還有一件事你可以考慮傳遞一個參數給轉換器進行比較,以便你的解決方案儘可能地定製。

2

我會想辦法讓在視圖模型bool財產,這是當Amount改變計算:

public bool IsAmountZero 
{ 
    get { return Amount == 0; } 
} 

private int _amount; 
public int Amount 
{ 
    get { return _amount; } 
    set 
    { 
     _amount = value; 
     OnPropertyChanged(); 
     OnPropertyChanged(nameof(IsAmountZero)); 
    } 
} 

,然後寫轉換器BoolToColorConverter(色彩有可能是通過某種方式ConverterParameter)。

// in current form it's actually BoolToColorRedGreenConverter 
public class BoolToColorConverter : MarkupExtension, IValueConverter 
{ 
    public BoolToColorConverter() { } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return this; 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value is bool) 
     { 
      var colorFalse = Colors.Green; 
      var colorTrue = Colors.Red; 
      if (parameter != null) 
      { 
       //... 
      } 
      return (bool)value ? colorTrue : colorFalse; 
     } 
     throw new InvalidCastException(); 
    } 

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

使用這樣

<Button.Background> 
     <SolidColorBrush Color="{Binding IsAmountZero, Converter={local:BoolToColorConverter}}" /> 
    </Button.Background> 

這將是相當重用的解決方案。

否則只是使轉換器IntZeroCheckToColorGreenRedConverter,但它不會很可重複使用與bool屬性相比。

想法與Brush屬性在視圖模型是壞的,因爲viewmodel不關心顏色。 Viewmodel應該只包含與模型相關的邏輯,然後由視圖使用。如果您只想更改顏色(例如,使用Blue而不是Green),則必須在視圖中完成此更改。因此bool屬性和BoolToColorConverter(或BoolToSolidBrushConverter直接使用xaml中的Background屬性)轉換器。

相關問題