【问题标题】:enum DataGridComboBoxColumn empty when AutoGenerateColumns = false in WPF/MVVMLight当 WPF/MVVMLight 中的 AutoGenerateColumns = false 时,枚举 DataGridComboBoxColumn 为空
【发布时间】:2014-07-03 03:50:56
【问题描述】:

使用MVVLight 开发WPF 应用程序。

在我的模型中,我有:

..an enum 命名为AttributeType

public enum AttributeType
    {
        TypeA = 0,
        TypeB = 1,
    }

..一个Attribute 类,它公开了AttributeType 类型的Type 属性:

public class Attribute : ObservableObject
{       
    //constructors, other fields etc omitted for brevity

    private AttributeType type;
    public AttributeType Type
    {
        get { return type; }
        set 
        { 
            type = value;
            RaisePropertyChanged(() => Type);
        }
}

..还有一个DataSet 类,其Attributes 属性类型为List<Attribute>

public class DataSet : ObservableObject
{       
    //constructors, other fields etc omitted for brevity

    private ObservableCollection<Attribute> attributes;
    public ObservableCollection<Attribute> Attributes
    {
        get { return attributes; }
        set 
        { 
            attributes = value;
            RaisePropertyChanged(() => Attributes);
        }
    }
}   

在我的主窗口中,我有一个DataGrid,它绑定到DataSet.Attributes,并有AutoGenerateColumns="true",例如:

<DataGrid Grid.Row="2" Grid.Column="0" Margin="5" CanUserAddRows="false" AutoGenerateColumns="true" ItemsSource="{Binding DataSet.Attributes}">

每当我通过我的ViewModel 实例化DataSet 类并填充DataSet.Attributes 时,DataGrid 正确地为Attribute.Type 显示DataGridComboBoxColumn 以及所有可能的AttributeType 枚举值。

但是,如果我转AutoGenerateColumns="false" 来设置我自己的列:

<DataGrid Grid.Row="2" Grid.Column="0" Margin="5" CanUserAddRows="false" AutoGenerateColumns="false" ItemsSource="{Binding DataSet.Attributes}">
     <DataGrid.Columns>
          <DataGridTextColumn Header="name" Width="*" Binding="{Binding Name}" />
          <DataGridComboBoxColumn Header="type" Width="*" SelectedItemBinding="{Binding Type}" />
     </DataGrid.Columns>
</DataGrid>

..DataGridComboBoxColumn 这次什么也没显示。其他列及其相应的绑定工作正常。我在这里想念什么?

【问题讨论】:

    标签: c# .net wpf mvvm-light wpfdatagrid


    【解决方案1】:

    请使用以下步骤。它工作正常(经过测试)。

    1.将资源添加到您的数据网格(或更高级别)。

            <DataGrid.Resources>
                <!--Create list of enumeration values-->
                <ObjectDataProvider x:Key="myEnum" MethodName="GetValues" ObjectType="{x:Type System:Enum}">
                    <ObjectDataProvider.MethodParameters>
                        <x:Type Type="local:AttributeType"/>
                    </ObjectDataProvider.MethodParameters>
                </ObjectDataProvider>
            </DataGrid.Resources>
    

    2。更新 DataGridComboBoxColumn 的绑定。解析枚举成员需要静态资源。请参阅第 1 步中的 MethodName,它返回绑定对象类型的值。

            <DataGrid.Columns>
                <DataGridComboBoxColumn Header="Value" ItemsSource="{Binding Source={StaticResource myEnum}}" Width="100"
                SelectedValueBinding="{Binding Type}" />
            </DataGrid.Columns>
    

    更新 1

    您还需要在主容器级别定义一个本地命名空间。将 WpfApplication1 替换为您的命名空间路径。

      xmlns:System="clr-namespace:System;assembly=mscorlib" 
    xmlns:local="clr-namespace:WpfApplication1"
    

    【讨论】:

    • 我已经添加了本地命名空间,但是 blend 突出显示了这一点:ObjectType="{x:Type System:Enum}"&gt; 并给出了这两个错误:The namespace prefix 'System' is not definedEnum is not supported in a WPF project
    • @globetrotter 检查我的更新。您还需要添加系统命名空间。
    • 这似乎可以解决问题,谢谢。如果这是默认解决方案,那对我来说感觉有点矫枉过正。为什么当AutoGenerateColumnsDataGrid 上设置为true 时,它​​知道如何解析enum 的成员?另外,您的解决方案可以与TwoWay 绑定一起正常工作吗?
    • 我将您的帖子标记为答案。不过仍然对上面的问题感到困惑。
    • @globetrotter 是的,我测试并更改了值实际上会更改模型。关于枚举解析,我们知道当 AutoGenerateColumns 设置为 true 时,DataGrid 会自动解析 Enum 成员,但如果 AutoGenerateColumns 设置为 false,ObjectDataProvider 是迄今为止唯一看起来直接的解决方案。 stackoverflow 中还有其他答案,但它们似乎与您使用 {RelativeSource Mode=FindAncestor...} 实现的要求完全不同。我很高兴看到更好的答案。
    猜你喜欢
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 2022-06-10
    • 1970-01-01
    相关资源
    最近更新 更多