C# 仅从UI的itemsource中删除项目

C# 仅从UI的itemsource中删除项目,c#,wpf,mvvm,enums,markup-extensions,C#,Wpf,Mvvm,Enums,Markup Extensions,我有一个与枚举绑定的组合框,我的枚举有None或NA值,这在模型级别是必需的,但这些值在UI级别与用户无关。我不想向用户显示它们。我也不想对viewmodel和view使用单独的枚举。所以我做了一个标记扩展,它将从项源中删除None或NA。这是我的代码` public sealed class EnumBindingHelper : MarkupExtension { private readonly Type _enumType; public EnumBindingHe

我有一个与枚举绑定的组合框,我的枚举有None或NA值,这在模型级别是必需的,但这些值在UI级别与用户无关。我不想向用户显示它们。我也不想对viewmodel和view使用单独的枚举。所以我做了一个标记扩展,它将从项源中删除None或NA。这是我的代码`

 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;
    }
}
我的观点是

 <ComboBox ItemsSource="{helpers:EnumBindingHelper {x:Type MyEnum}}" SelectedItem="{Binding SelectedValue,Mode=TwoWay}"/>
Iam还在我的viewmodel代码中设置SelectedValue=value1。
任何人都可以解释为什么会发生这种情况以及我如何解决这个问题。我希望正常的行为,如所选项目应按照绑定或第一个项目(如果所选项目为空)。

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();
}
私有静态只读字符串[]排除=
新字符串[]{“无”、“无”、“Na”、“Na”};
公共覆盖对象ProviderValue(IServiceProvider服务提供程序)
{
返回Enum.GetValues(_enumType).Cast()
.Where(e=>!exclude.Contains(e.ToString()).ToList();
}

这是一个参考问题。如果要从viewmodel设置所选值,则必须从ItemSource获取所需的值。否则它总是空的我能想到解决办法。。但我会尝试设置issynchronizedwithcurrentitem=“True”/system.windows.controls.primitives.selector.issynchronizedwithcurrentitem%28v=vs.110%29.aspx
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();
}