我目前在将对象绑定到WPF ListBox时遇到了一些麻烦。正确填充元素数,但无法访问Name属性。我收到以下错误消息:
System.Windows.Data错误:40:BindingExpression路径错误:'名称'在' object'上找不到的属性'' __ ComObject' (的HashCode = 17252513)&#39 ;. BindingExpression:路径=名称;的DataItem =' __ ComObject' (的HashCode = 17252513);目标元素是' TextBlock' (名称='&#39);目标 财产是' Text' (键入' String')
但是,我可以在运行时将此属性正确地打印到控制台。
看起来对象没有正确投放
XAML:
<ListBox Name="lbSelectConfiguration" Margin="10" ItemsSource="{Binding Configurations}">
<ListBox.ItemTemplate>
<StackPanel Margin="5" Orientation="Horizontal">
<Image Source="/Resources/Configuration.png" Margin="0,0,8,0" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
代码
this.DataContext = viewModel;
this.viewModel = viewModel;
foreach (Configuration config in this.viewModel.Configurations)
{
Console.WriteLine(config.Name);
}
你能救我吗?谢谢。
答案 0 :(得分:1)
因为错误中提到了__ComObject
,所以我假设你绑定的对象集合实际上是实现“Configuration”接口的COM对象,而不是CLR接口。
(无论该COM对象是否实际使用C#(使用ComVisible(true))或C ++实现都是无关紧要的,这是你使用“接口”的事实 - 假设它来自“COM互操作库”,即之后你做了一个COM库的添加引用?)。
你可以试试这个:
<TextBlock Text="{Binding (mynamespacewithinterface:Configuration.Name)}" />
否则你可以查看这些链接,了解Binding系统解决绑定的难度(COM接口和.NET接口都有自己的怪癖/限制),以及一些解决方法:
答案 1 :(得分:0)
据我所知,ComObjects
在.NET中是dynamic
,因此编译器在编译时永远不会识别对象属性的名称。如果这对您来说非常重要,那么只需创建一个实现INotifyPropertyChanged
接口的.NET包装器对象,并将所有对象的属性复制到WPF对象中。然后编译器显然能够读取属性的名称。