自定义MarkupExtension的学习,以及WPF中Combobox绑定枚举类型
我们上一期讲到ComBobox绑定数据,https://www.cnblogs.com/guchen33/p/17630808.html
这次我们简单化一下,
正常来讲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
}
运行后可看到
接下来。我们讲讲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文件