【发布时间】:2020-01-30 22:59:58
【问题描述】:
在一个看起来像这样的 Datagrid 中,我遇到了一个异常:
<DataGrid x:Name="ModuleGrid" AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Module Name" Binding="{Binding Path=Name}"/>
<DataGridTextColumn Header="uName" Binding="{Binding Path=UniqueName}"/>
<DataGridTemplateColumn Header="Features">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Feature.Name}"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Path=Features}"
SelectedItem="{Binding Path=Feature}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Name}"></TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
到目前为止一切顺利,几乎一切正常。但是,当我在我的 ComboBox 上选择 Item 时:
我得到了例外:
System.InvalidOperationException: "Die bidirektionale Bindung erfordert“路径”或“XPath”。”
后面的 C# 代码是一个对象,其中包含一个功能列表 (List<Feature>),其中包含Features。我这样初始化它:
List<Module> test_3 = pPP_2.Components.Modules.Values.Cast<Module>().ToList();
ModuleGrid.ItemsSource = test_3;
编辑:模块类:
class Module
{
public string Name { get; set; }
public string UniqueName { get; set; }
public Dictionary<Property, double> Properties { get; set; }
public List<Feature> Features { get; set; }
private Dictionary<Material, double> content = new Dictionary<Material, double>();
public Dictionary<Material, double> Content
{
get { return content; }
set { content = value; }
}
public double FillingCapacity { get; set; }
public double FillingAmount
{
get
{
double ret = 0;
foreach (double a in Content.Values)
{
ret += a;
}
return ret;
}
}
}
要素类:
class Feature
{
public string Name { get; set; }
public string FeatureType { get; set; }
public Property UsedProperty { get; set; }
public double MinValue { get; set; }
public double MaxValue { get; set; }
public double ChangePerMinutePerLiter { get; set; }
}
属性类:
class Property
{
public string Name { get; set; }
public double DefaultValue { get; set; }
public string Unit { get; set; }
}
【问题讨论】:
-
Module是自定义类吗?如果是这样,您可以将其添加到您的帖子中吗?另外,StackTrace中是否有更多关于异常的信息,例如行号等? -
添加了所有内容。
StackTrace中没有关于行等的信息,它只告诉我编译main()时失败 -
感谢您添加。您能否展示一下您是如何创建
pPP_2的?我认为 WPF 在某个级别为该对象的值解析属性可能存在问题。可能是由于其中一个值不是属性,而是普通的旧字段。另外,您是否尝试过将test_3声明为具有 getter 和 setter 的属性? -
您的意思是
Components是一个存在于名为pPP_2的文件夹中的类,并且该文件夹中项目的命名空间是WPFProjectName.pPP_2?例如,它可能看起来像namespace WpfApp4.pPP_2 { public class Components { public static Dictionary<string, Module> Modules { get; set; } } }我已经在我的测试项目上进行了这个工作,所以我可能不会像你一样对 DictionaryComponents做一些事情。 -
目前还不是解决方案,但您可以采取一些措施来消除其中一个潜在问题。将
ComboBox.ItemTemplate(以及里面的所有内容)替换为DisplayMemeberPath="Name"。这让 ComboBox 知道显示Feature的Name属性,而无需声明您自己的模板。无需担心的束缚。
标签: c# wpf .net-core combobox datagrid