绑定到COM对象 - 无法解析属性

时间:2015-03-20 09:29:19

标签: c# wpf xaml mvvm

我目前在将对象绑定到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);
  }
你能救我吗?谢谢。

2 个答案:

答案 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对象中。然后编译器显然能够读取属性的名称。