【问题标题】:How to bind DataGridComboBoxColumn to List<string>如何将 DataGridComboBoxColumn 绑定到 List<string>
【发布时间】:2021-06-28 06:31:14
【问题描述】:

我想为每一行创建一个带有特定选项的 ComboBoxColumn

例如

列表字符串

public List<string> Types
        {
            get
            {
                if (PropertyType == typeof(bool))
                {
                    return FilterCharacters.BoolList;
                }

                if (PropertyType == typeof(string))
                {
                    return FilterCharacters.TextList;
                }
                if (PropertyType == typeof(int) || PropertyType == typeof(double) ||
                    PropertyType == typeof(float))
                {
                    return FilterCharacters.NumberList;
                }
                return new List<string>();
            }
        }

列出自己

public static class FilterCharacters
    {
        public static Dictionary<FilterTypes, string> FilterCharactersList => new Dictionary<FilterTypes, string>()
                {
                    {FilterTypes.Equals, "=" },
                    {FilterTypes.NotEquals, "!=" },
                    {FilterTypes.Greater, ">" },
                    {FilterTypes.GreaterOrEqual, ">=" },
                    {FilterTypes.Less, "<" },
                    {FilterTypes.LessOrEqual, "<=" },
                    {FilterTypes.Contains, "contains" },
                    {FilterTypes.NotContains, "does not contain" },
                    {FilterTypes.True, "True" },
                    {FilterTypes.False, "False" }
                };

        public static List<string> NumberList => new List<string>()
        {
            FilterCharactersList[FilterTypes.Greater],
            FilterCharactersList[FilterTypes.GreaterOrEqual],
            FilterCharactersList[FilterTypes.Less],
            FilterCharactersList[FilterTypes.LessOrEqual],
            FilterCharactersList[FilterTypes.Equals],
            FilterCharactersList[FilterTypes.NotEquals]
        };

        public static List<string> TextList => new List<string>()
        {
            FilterCharactersList[FilterTypes.Contains],
            FilterCharactersList[FilterTypes.NotContains],
            FilterCharactersList[FilterTypes.Equals],
            FilterCharactersList[FilterTypes.NotEquals]
        };

        public static List<string> BoolList => new List<string>()
        {
            FilterCharactersList[FilterTypes.True],
            FilterCharactersList[FilterTypes.False]
        };
    }

和xaml

<DataGrid ItemsSource="{Binding}"  Grid.Row="0" Grid.Column="0" x:Name="FiltersList1" AutoGenerateColumns="False">
            <DataGrid.Columns>
...
<DataGridComboBoxColumn Width="120" ItemsSource="{Binding Path=Types}"/>

我尝试绑定到 FiltersList1 DataContextItemsSource,我还尝试指定 SelectedItemBindingComboBoxStyles 但这一切都以什么都没有(一个空的组合框)或输出中的错误结尾

System.Windows.Data 错误:2:找不到管理 FrameworkElement 或 FrameworkContentElement 为目标元素。 BindingExpression:Path=DataContext.Types;数据项=空;目标 元素是“DataGridComboBoxColumn”(HashCode=15167431);目标 属性是“ItemsSource”(类型“IEnumerable”)

我的想法已经用完了,无法将互联网上找到的任何答案与这个问题相匹配

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    诀窍是使用ElementStyleEditingElementStyle 来设置ItemsSource

    <DataGridComboBoxColumn Width="120">
        <DataGridComboBoxColumn.ElementStyle>
            <Style TargetType="ComboBox">
                <Setter Property="ItemsSource" Value="{Binding Types}" />
            </Style>
        </DataGridComboBoxColumn.ElementStyle>
        <DataGridComboBoxColumn.EditingElementStyle>
            <Style TargetType="ComboBox">
                <Setter Property="ItemsSource" Value="{Binding Types}" />
            </Style>
        </DataGridComboBoxColumn.EditingElementStyle>
    </DataGridComboBoxColumn>
    

    【讨论】:

    • 感谢您的回答,它确实按预期显示了项目,但现在我偶然发现了选择项目的问题。当我将选择从空白更改为任何元素并更改单元格时,选择会返回空白。你知道如何预防吗?
    • 如果您还有其他问题,请提出新问题。您的原始问题已得到解答。
    猜你喜欢
    • 2013-09-05
    • 1970-01-01
    • 2011-02-10
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    相关资源
    最近更新 更多