如果你還不知道數據觸發器怎么使用,或者連數據觸發器是什么都還不了解,請先閱讀WPF觸發器之數據觸發器(A)。
1. 當你知道了數據觸發器是當某個.NET屬性值變化時觸發的操作,比如說當數字變成了 "8",那就讓數字變成紅色。那么使用數據觸發器實現此功能就可以這樣寫:
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},Path=Text}" Value="8"> ...
2. 問題來了——可是,當 "DataTrigger" 的 "Value" 是一個變量值你要怎么辦呢??
如果你了解過WPF綁定,你可能會先想到這樣來修改你的代碼:
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},Path=Text}" Value="{Binding Path=RedNumber}"> ...
運行程序,編譯器會拋出一個錯誤使用導致的異常:
此異常說不能在 "Datatrigger" 的 "Value" 屬性上使用 "Banding" ,原因是它不是一個依賴屬性。只有依賴屬性可以使用 “Binding" 。
關於此異常的詳細信息,請大家自行查閱 ”Binding“ 和 ”依賴屬性“ 的說明,在這里不做過多解釋。
3. 這個問題,在MSDN技術論壇有人進行了探討:如何在DataTrigger的Value中設定程序級變量? UserControl中如何綁定窗體變量?
4. 解決方案。
使用多重綁定,關於WPF "多重綁定" 的知識,請查看MSDN文檔,在這里也不做過多解釋。查看 "多重綁定" 請點擊這里。
此問題是因為不使用固定的值 "8" 來進行數字紅色顯示引起的,而是需要根據變量 "InputValue" 決定。
所以,此解決辦法的原理是把變量值 "InputValue" 和當前的值 "NowValue" 都傳入某個方法,返回一個布爾值,表示 "InputValue" 和 "NowValue" 是否相等。
這樣,就可以把 Value="{Binding Path=RedNumber}"轉換為 Value="true",即把變化值轉化為布爾值 “true”。
下面給出具體步驟:
多重綁定需要使用多值轉換器。
<a> 首先定義一個多值轉換器類:TimeIsUpConverter。代碼如下:
1 public class TimeIsUpConverter : IMultiValueConverter 2 { 3 public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 4 { 5 if (values == null) 6 return false; 7 8 string strInputValue = values[0].ToString(); 9 10 int inputValue = 0; 11 bool inputValueIsNumber = int.TryParse(values[0].ToString(), out inputValue); 12 int nowTime = 0; 13 bool nowValueIsNumber = int.TryParse(values[1].ToString(), out nowTime); 14 15 if (inputValueIsNumber && nowValueIsNumber) 16 { 17 return inputValue == nowTime; 18 } 19 return false; 20 } 21 22 public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 23 { 24 throw new NotImplementedException(); 25 } 26 }
<b> 在xaml文件中引用剛剛定義轉換器。
<UserControl xmlns:views="clr-namespace:TimerWarningApp.Views" ...
<UserControl.Resources> <views:TimeIsUpConverter x:Key="timeIsUpConverter" /> </UserControl.Resources>
<c> 修改數據轉換器的代碼:
<Style.Triggers> <DataTrigger> <DataTrigger.Binding> <MultiBinding Converter="{StaticResource ResourceKey=timeIsUpConverter}"> <Binding ElementName="tbInputValue" Path="Text" /> <Binding ElementName="tbNowValue" Path="Text" /> </MultiBinding> </DataTrigger.Binding> <DataTrigger.Value>true</DataTrigger.Value> </DataTrigger> </Style.Triggers>
OK,問題解決!