WPF ObjectDataProvider學習(一)
阿新 • • 發佈:2021-07-27
https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.data.objectdataprovider?view=net-5.0
ObjectDataProvider 提供了一種簡便的方法,可在 XAML 中建立物件並將物件用作繫結源物件,但不會替換現有的資料模型
使用ObjectDataProvider
準備一個列舉類
1 public enum EWeekDay 2 { 3 星期一, 4 5 星期二, 6 7 星期三, 8 9 星期四, 10 11星期五, 12 13 星期六, 14 15 星期天, 16 }
準備一個顏色轉換器
1 public class Converter : IValueConverter 2 { 3 public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 4 { 5 PropertyInfo propertyInfo = (PropertyInfo)value;//從這裡也可以看出 ObjectDataProvider就是使用的反射機制 6 var str = propertyInfo.GetValue(value).ToString(); 7 var color = (Color)ColorConverter.ConvertFromString(str); 8 var brush = new SolidColorBrush(color); 9 return brush; 10 } 11 12 public objectConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 13 { 14 throw new NotImplementedException(); 15 } 16 }
介面
1 <Window 2 x:Class="ObjectDataProvider繫結到方法.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:local="clr-namespace:ObjectDataProvider繫結到方法" 7 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 8 Title="MainWindow" 9 Width="800" 10 Height="450" 11 FontSize="20" 12 mc:Ignorable="d"> 13 <Window.Resources> 14 <ObjectDataProvider 15 x:Key="Provider" 16 MethodName="GetProperties" 17 ObjectInstance="{x:Type Colors}" /> 18 <!-- ObjectInstance和ObjectType只能使用一種 ObjectInstance有點像反射 --> 19 20 <ObjectDataProvider 21 x:Key="EnumProvider" 22 MethodName="GetEnumValues" 23 ObjectInstance="{x:Type local:EWeekDay}" /> 24 <!-- 顏色轉換器 --> 25 <local:Converter x:Key="Converter" /> 26 </Window.Resources> 27 <Grid> 28 <Grid.ColumnDefinitions> 29 <ColumnDefinition Width="1*" /> 30 <ColumnDefinition Width="1*" /> 31 </Grid.ColumnDefinitions> 32 33 <ListView Grid.Column="0" ItemsSource="{Binding Source={StaticResource Provider}}"> 34 <ListView.ItemTemplate> 35 <DataTemplate> 36 <StackPanel Orientation="Horizontal"> 37 <TextBlock Background="{Binding Converter={StaticResource Converter}}" Text="{Binding Name}" /> 38 </StackPanel> 39 </DataTemplate> 40 </ListView.ItemTemplate> 41 </ListView> 42 <ListView Grid.Column="1" ItemsSource="{Binding Source={StaticResource EnumProvider}}" /> 43 </Grid> 44 </Window>
執行結果