WPF觸發器之數據觸發器(B)


如果你還不知道數據觸發器怎么使用,或者連數據觸發器是什么都還不了解,請先閱讀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,問題解決!

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM