自定义MarkupExtension的学习,以及WPF中Combobox绑定枚举类型

发布时间 2023-08-16 10:06:30作者: 孤沉

我们上一期讲到ComBobox绑定数据,这次我们简单化一下,
正常来讲WPF中绑定不了枚举的像这样

//前台代码
<ComboBox ItemsSource="{Binding MyEnum}"/>

//后台VM
 public enum MyEnum
 { 
     One,
     Two,
     Three,
     Four,
     Five
 }

这种会报错
这个时候我们需要用到MarkupExtension类
1、新建一个EnumBindingExtension类,放在Enums文件夹

 public class EnumBindingExtension : MarkupExtension
 {
     private Type _enumType;

     public EnumBindingExtension(Type enumType)
     {
         if (enumType == null || !enumType.IsEnum)
         {
             throw new ArgumentException("Enum type is required.");
         }

         _enumType = enumType;
     }

     public override object ProvideValue(IServiceProvider serviceProvider)
     {
         return Enum.GetValues(_enumType);
     }
 }

MarkupExtension是Xaml的标记扩展
在这段代码中我们自定义EnumBindingExtension然后进行类型转换
然后,前台代码写

<ComboBox ItemsSource="{markup:EnumBinding {x:Type vm: MyEnum}}" Width="200" Height="24"/>

VM代码写

 public enum MyEnum
 { 
     One,
     Two,
     Three,
     Four,
     Five
 }

运行后可看到
image

接下来。我们讲讲MarkupExtension的其他用法
首先我们继续自定义类

 public class TextBlockExtension : MarkupExtension
 {
     // 实现基类中的 ProvideValue 方法 IServiceProvider暂时用不到
     public override object ProvideValue(IServiceProvider serviceProvider)
     {
         return "Hello World!";
     }
}

前台直接写

 <TextBlock Text="{markup:TextBlock}" />

可以看到我们的TextBlock Text绑定的值是Hello World!
这种写法对于TextBlock直接写

<TextBlock Text="Hello World!" />
复杂了一部分,但是对于有我们使用其他UIElement能更好的扩展Xaml文件