Binding(三):资源和ValueConverter
????這節(jié)講資源和值轉換器(ValueConverter)。
資源
????在XAML中,我們想要使用外部的數(shù)據(jù)或者類,需要引入其命名空間,然后將其定義為XAML頁面的資源,供給控件使用,或者我們需要封裝一個共用的樣式,同樣也需要定義成資源來使用,下面我們看一下如何定義一個資源:
<Window.Resources><ResourceDictionary><sys:String x:Key="show">我是一個資源</sys:String><Style x:Key="styleShow" TargetType="Button"><Setter Property="Background" Value="Purple" /><Setter Property="Foreground" Value="White" /> </Style></ResourceDictionary> </Window.Resources>????資源的類型是ResourceDictionary,顧名思義,資源是用鍵值對存儲的,所以定義資源時需要給它個key,這個Key的value則根據(jù)定義資源的不同千變萬化了,像上方代碼中,定義一個string資源,它的value就是一個普通的字符串,定義一個樣式資源,它的value就是一個定義樣式的setter對象。
????那定義資源后,如何使用呢,這就又要用到標記擴展語法了,請看下面的代碼:
<StackPanel><Button Content="{StaticResource show}" Style="{StaticResource styleShow}" /> </StackPanel>????使用StaticResource命令獲取一個資源,后面接資源的key,我給這個button引入了上方定義的資源,運行效果如下:
????另外,除了StaticResource,還有一個DynamicResource命令,StaticResource在程序一開始加載一次,如果資源中途變動,是不會再更新到使用它的控件上的,而DynamicResource則相反,它會跟著資源的更新而更新,所以要合理使用兩者。
????后臺代碼中,聲明資源和獲取資源就簡單多了,代碼如下:
this.Resources.Add("show", "我是個資源");//定義資源 object data = this.Resources["show"]; this.FindResource("show");????后臺無非就是操作鍵值對集合,并且我們也可以使用FindResource方法來尋找資源。
ValueConverter
????上節(jié)我們提到一個情景,將Button的顯示與隱藏跟CheckBox是否選中做綁定,這個就需要用到我們接下來講的ValueConverter。
????首先我們需要新建一個類,代碼如下:
class BoolToVisibilityConvert : IValueConverter {public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value == null)return?DependencyProperty.UnsetValue;if ((bool)value == true){return Visibility.Visible;}else?return?Visibility.Collapsed;}public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){if (value == null)return?false;if ((Visibility)value == Visibility.Visible){return true;}else return false;} }?????使用ValueConverter需要實現(xiàn)IValueConverter接口,其內部有兩個方法,Convert和ConvertBack。我們在使用Binding綁定數(shù)據(jù)的時候,當遇到源屬性和目標控件需要的類型不一致的,就可以使用ValueConverter,它就相當于一個橋,當數(shù)據(jù)從源到目標控件時,需要走Convert方法,我們在這個方法里邊就可以自定義轉換邏輯,當數(shù)據(jù)從目標控件到源時,需要走ConvertBack方法,我們可以在這里邊自定義回轉邏輯。
????上述代碼中,我就實現(xiàn)了Button的Visibility屬性和bool之間的轉換,下面我們需要將這個類作為資源,載入XAML頁面,讓Button使用,代碼如下:
<Window.Resources><ResourceDictionary><local:BoolToVisibilityConvert x:Key="B2V" /></ResourceDictionary> </Window.Resources>????這個ValueConverter類的命名空間就是當前項目的命名空間,所以直接使用local即可,local是默認代表當前代碼的命名空間簡稱,具體相關XAML命名空間的知識參見前文:剖析XAML語言。
??? XAML代碼如下:
<StackPanel><CheckBox x:Name="CB" Click="CheckBox_Click" /><ButtonContent="{StaticResource show}"Style="{StaticResource styleShow}"Visibility="{Binding ElementName=CB, Path=IsChecked, Converter={StaticResource B2V}}" /> </StackPanel>????程序運行效果如下:
? ? ? ?最后來解釋一下轉換方法的四個參數(shù),第一個就是數(shù)據(jù),我們要轉換的值就是它,第二個參數(shù)是目標類型,當從bool轉換為Visibility時,這個參數(shù)就是Visibility,反之則是bool,第三個參數(shù)是轉換參數(shù),可以在標記擴展中定義,第四個是文化參數(shù),也是可以在擴展標記中定義,詳見如下:
Visibility="{Binding ElementName=CB, Path=IsChecked, Converter={StaticResource B2V},ConverterParameter=true,ConverterCulture=zh-CN}"?????第三個參數(shù)主要是提供一些轉換上的輔助,帶給我們用于轉換的更多的信息,第四個我個人理解多用在國際化上,我們可以根據(jù)這個參數(shù)獲取當前的語言環(huán)境,這兩個都不是擴展屬性,都不能使用標記擴展。
本節(jié)到此結束,喜歡就點個在看吧...
總結
以上是生活随笔為你收集整理的Binding(三):资源和ValueConverter的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows 11 操作系统最低硬件要
- 下一篇: Binding(二):控件关联和代码提升