【问题标题】:Removing an item from itemsource for UI only仅针对 UI 从 itemsource 中删除项目
【发布时间】:2023-03-15 20:35:02
【问题描述】:

我有一个与枚举绑定的组合框,我的枚举具有模型级别所需的 None 或 NA 值,但这些值与 UI 级别的用户无关。我不想向用户展示它们。我也不想为视图模型和视图使用单独的枚举。所以我做了一个标记扩展,它将从项目源中删除 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}"/>

它在 UI 中工作正常,我在组合框中没有看到 NA 和 none 值,但是当我启动应用程序时,UI 中的选定项目始终为空。

我的枚举是

MyEnum
{
   value1=0,
   value2=1,
   value3=2,
   None=4

}

我还在我的视图模型代码中设置 SelectedValue=value1。 任何人都可以解释为什么会发生这种情况以及我该如何解决这个问题。我希望正常行为,如所选项目应该按照绑定或第一个项目(如果所选项目为空)。

【问题讨论】:

  • 这是一个参考问题。如果要从视图模型中设置选定的值,则可以从 ItemSource 中获取所需的值。否则它将始终为空
  • 我能想到解决方法.. 但我会尝试设置 issynchronizedwithcurrentitem="True" msdn.microsoft.com/en-us/library /system.windows.controls.primitives.selector.issynchronizedwithcurrentitem%28v=vs.110%29.aspx

标签: c# wpf mvvm enums markup-extensions


【解决方案1】:

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();
}

【讨论】:

    猜你喜欢
    • 2013-07-23
    • 2013-11-02
    • 1970-01-01
    • 2013-05-22
    • 2019-01-26
    • 1970-01-01
    • 2021-10-07
    • 2014-01-16
    • 2012-10-06
    相关资源
    最近更新 更多