【问题标题】:How to bind enum into combobox inside data template如何将枚举绑定到数据模板内的组合框
【发布时间】:2019-02-19 01:39:50
【问题描述】:

我有一个 枚举,我需要将其绑定到 ComboBox。 ComboBox 位于 数据模板标签 内。如何将枚举绑定到 ComboBox?

这是枚举:

 public enum Status
{
    Enable,
    Disable
}

这是 xaml:

<Window.Resources>
    <cv:StatusToBooleanConverter x:Key="statusToBooleanConverter"/>
    <ObjectDataProvider x:Key="dataFromEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="enum:Status"/>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>
<DataTemplate>
  <StackPanel>
     <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGrid}}, 
     Path=DataContext.Statusstring}" x:Name="cbProductionLineStatus" 
     FlowDirection="LeftToRight" FontSize="16" Foreground="MidnightBlue" 
     HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
   </StackPanel>    
</DataTemplate>

这是视图模型代码:

public List<Status> status;

    public List<Status> Statusstring
    {
        get
        {
            foreach (List<Status> iColor in System.Enum.GetValues(typeof(Status)))
            {
                status =  iColor;
            }

            return status;
        }
    }

我尝试在中途实现查找祖先方法并卡住了。

<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGrid}},
                                Path=?}" SelectedValue="{Binding ProductionLineStatus,Mode=TwoWay}" SelectedValuePath="ProductionLineStatus" DisplayMemberPath="ProductionLineStatus" x:Name="cbProductionLineStatus" FlowDirection="LeftToRight" FontSize="16" Foreground="MidnightBlue" 
                                HorizontalAlignment="Stretch" VerticalAlignment="Center" />

我正在尝试将枚举状态填充到我的组合框中,但它失败了。但是,现在我正在尝试按照 Steven 所述的解决方案实施,但仍然无法正常工作。

【问题讨论】:

  • Enums 可以转换为intint 可以存储在组合框中。请记住,Enums 通常是首选,以提高后面代码的可读性。而不是让他们的名字成为前端程序的实际部分。
  • @Steven 请再次查看我的问题。这里的问题是将状态绑定到组合框。如果我在数据模板之外有组合框,我可以成功绑定它。
  • 你能从 datatemplate 访问 dataFromEnum 吗?假设,即。它是一个字符串数组?
  • ItemsSource 完全相同。 DataTemplate 也应该被定义为一个资源。

标签: c# wpf enums combobox binding


【解决方案1】:

我可以通过实现这样的视图模型来解决这个问题:

public Status status = Status.Enable;

    public List<string> Statusstring {
        get
        {
            return System.Enum.GetNames(typeof(Status)).ToList();

        }

    }

这是我的 xaml:

 <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGrid}},
                                Path=DataContext.Statusstring}" SelectedValue="{Binding ProductionLineStatus, Converter={StaticResource statusToBooleanConverter}, Mode=TwoWay}" x:Name="cbProductionLineStatus" FlowDirection="LeftToRight" FontSize="16" Foreground="MidnightBlue" 
                                HorizontalAlignment="Stretch" VerticalAlignment="Center"/>

【讨论】:

    【解决方案2】:

    我想我可以通过编写一个属性并在 Combobox 中使用该属性来解决它:

    类似这样的东西:

    public Status status = Status.Enable;
    
    public string Statusstring
    {
        get
        {
            if (status == Status.Enable)
                return "Enable";
            else
                return "Disable";
        }
    }
    

    【讨论】:

    • 究竟是什么不工作?您是否收到排序或错误消息?我定义数据源的方式与您的不同。只使用datasource="Statusstring" ,但我认为这是因为我使用的是 ASP.NET,而不是 wpf。
    • 实际上,没有显示错误消息,但是当我尝试您的方法时,它只显示启用作为所有行中的状态,即使我只有很少的行状态是禁用。是的,我正在使用 wpf。
    • 好吧,看来您已经设法自己解决了,这很好。 :)
    猜你喜欢
    • 2011-08-04
    • 2018-11-12
    • 2020-02-07
    • 1970-01-01
    • 2011-05-17
    • 2010-09-08
    • 1970-01-01
    • 2016-02-06
    相关资源
    最近更新 更多