我有一个与Enum绑定的组合框,我的Enum在模型级别需要无或NA值,但这些值与UI级别的用户无关。我不想向用户显示它们。我也不想为视图模型和视图使用单独的枚举。所以我做了一个标记扩展,它将从项目源中删除无或NA。这是我的代码`
(+alpha >> eoi | +alnum >> eoi)
我的视图绑定是
public sealed class EnumBindingHelper : MarkupExtension
{
private readonly Type _enumType;
public EnumBindingHelper(Type enumType)
{
_enumType = enumType;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
var arr= Enum.GetValues(_enumType);
var list = (from object item in arr select item.ToString()).ToList();
list.RemoveAll(x => x.Equals("None") || x.Equals("NA") || x.Equals("NONE") || x.Equals("Na"));
return list;
}
}
它在UI中运行良好,我在组合框中看不到NA和没有值,但是当我启动应用程序时,UI中的选定项目总是空的。
MY enum是
<ComboBox ItemsSource="{helpers:EnumBindingHelper {x:Type MyEnum}}" SelectedItem="{Binding SelectedValue,Mode=TwoWay}"/>
Iam还在我的viewmodel代码中设置了SelectedValue = value1。 任何人都可以解释为什么会发生这种情况以及如何解决这个问题。如果所选项目为空,我希望所选项目的正常行为应该是按照绑定或第一项。
答案 0 :(得分:0)
MarkupExtension应该返回过滤的枚举值而不是字符串:
private static readonly string[] exclude =
new string[] { "None", "NONE", "Na", "NA" };
public override object ProvideValue(IServiceProvider serviceProvider)
{
return Enum.GetValues(_enumType).Cast<object>()
.Where(e => !exclude.Contains(e.ToString())).ToList();
}