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 object ConvertBack(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>


运行结果

WPF ObjectDataProvider学习(一)_microsoft