c# - 将数据从 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()
{
}
}
解决方案
解决这个问题的方法不是使用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>
推荐阅读
- asp.net-mvc - 当前上下文错误VS2017中不存在名称'Url'
- javascript - 测试异步 SQS sendMessage
- c# - 如何使用 PdfiumViewer 将 PDF 转换为位图图像?
- java - Java程序获取gradle构建文件中的版本号
- karate - 空手道模式验证,在使用匹配包含断言时它是否适用于嵌套数组?
- c# - 表示 TFS 服务挂钩事件的 C# 对象
- xslt-2.0 - 如何检查给定的逗号分隔值是否为升序数字序列
- javascript - 取消异常传播
- angular - Angular何时取消订阅()?
- javascript - 从被调用者隐藏异步/等待模式