首页 > 解决方案 > 将数据从 JSON 还原到 WPF 时,DisplayMemberPath 为空白

问题描述

我有一个 DataGridComboBox 并且 ItemsSource 和 SelectedItemBinding 都正确绑定。

XAML:

    <Grid>
        <Grid.Resources>
            <CollectionViewSource Source="{Binding BicnList}" x:Key="bicnList"/>
        </Grid.Resources>
        <DataGrid ItemsSource="{Binding DgNamingConventionRows}"
            <DataGrid.Columns>
                <DataGridComboBoxColumn Header="Category"
                                        ItemsSource="{Binding Source={StaticResource bicnList}}"
                                        DisplayMemberPath="CategoryName"
                                        SelectedItemBinding="{Binding BuiltInCategoryName, UpdateSourceTrigger=PropertyChanged}">
                     <DataGridComboBoxColumn.EditingElementStyle>
                         <Style TargetType="{x:Type ComboBox}"/>
                     </DataGridComboBoxColumn.EditingElementStyle>
                </DataGridComboBoxColumn>
                <!--............!-->
           </DataGrid.Columns>
        </DataGrid>
     </Grid>

打开组合框时,所有选项都正确显示,当我选择一个项目时,我也可以DisplayMemberPath正确看到。

在此处输入图像描述

我正在使用 json 保存这些数据,这也是正确完成的。

在此处输入图像描述

但是,关闭窗口后,我想在再次打开 WPF 时恢复这些数据。数据恢复,反序列化工作正常,但是Category Combobox下没有显示。DisplayMemberPath 为空白。这个问题的原因可能是什么?任何帮助将不胜感激。

在此处输入图像描述

C#:

    private ObservableCollection<BuiltInCategoryName> _bicnList = new
                ObservableCollection<BuiltInCategoryName>();
            
            [JsonIgnore]
            public ObservableCollection<BuiltInCategoryName> BicnList
            {
                get
                {
                    return _bicnList;
                }
                set
                {
                    _bicnList = value;
                    NotifyPropertyChanged("BicnList");
                }
            }
    public class BuiltInCategoryName : NotifierBase
    {
        //display Category.Name
        //save BuiltInCategory.Id
     
        public string CategoryName { get; set; }
     
        public BuiltInCategory BuiltInCategoryId { get; set; }
     
        public BuiltInCategoryName(Document doc, BuiltInCategory bic)
        {
            Category cat = null;
            try
            {
                cat = Category.GetCategory(doc, bic);
            }
            catch
            { }
            CategoryName = cat?.Name;
            BuiltInCategoryId = bic;
        }
        public BuiltInCategoryName()
        {
        }
    }
    public class ParameterRow : NotifierBase
        {
            private BuiltInCategoryName builtInCategoryName ;
            public BuiltInCategoryName BuiltInCategoryName 
            {
                get { return builtInCategoryName ; }
                set
                {
                    SetNotify(ref builtInCategoryName , value);
                }
            }
     
            private string patternText;
            public string PatternText
            {
                get { return patternText; }
                set
                {
                    SetNotify(ref patternText, value);
                }
            }
     
            private string comparisonValue;
            public string ComparisonValue
            {
                get { return comparisonValue; }
                set
                {
                    SetNotify(ref comparisonValue, value);
                }
            }
     
            public ParameterRow(BuiltInCategoryName category, string patternText, string comparison)
            {
                BuiltInCategoryName = category;
                PatternText = string.IsNullOrEmpty(patternText) ? "" : patternText;
                ComparisonValue = string.IsNullOrEmpty(patternText) ? "Prefix" : comparison;
            }
            public ParameterRow()
            {
            }
        }

标签: c#jsonwpfrestore

解决方案


解决这个问题的方法不是使用SelectedItemBinding我使用的属性SelectedValueBinding

XAML:

 <Grid>
    <Grid.Resources>
        <CollectionViewSource Source="{Binding BicnList}" x:Key="bicnList"/>
    </Grid.Resources>
    <DataGrid ItemsSource="{Binding DgNamingConventionRows}"
        <DataGrid.Columns>
            <DataGridComboBoxColumn Header="Category"
                                    ItemsSource="{Binding Source={StaticResource bicnList}}"
                                    DisplayMemberPath="CategoryName"
                                    SelectedValueBinding="{Binding BuiltInCategoryName, UpdateSourceTrigger=PropertyChanged}">
                 <DataGridComboBoxColumn.EditingElementStyle>
                     <Style TargetType="{x:Type ComboBox}"/>
                 </DataGridComboBoxColumn.EditingElementStyle>
            </DataGridComboBoxColumn>
            <!--............!-->
       </DataGrid.Columns>
    </DataGrid>
 </Grid>

推荐阅读