【问题标题】:Binding to a COM Object - Cannot resolve a Property绑定到 COM 对象 - 无法解析属性
【发布时间】:2015-03-20 09:29:18
【问题描述】:

我目前在将对象绑定到 WPF 列表框时遇到了一些问题。元素的数量已正确填充,但无法访问 Name 属性。我收到以下错误消息:

System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“__ComObject”(HashCode=17252513)上找不到“名称”属性。 绑定表达式:路径=名称; DataItem='__ComObject' (哈希码=17252513);目标元素是'TextBlock'(名称='');目标 属性是“文本”(类型“字符串”)

但是,我可以在运行时将此属性正确打印到控制台。

看起来对象没有正确投射

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);
  }

你能帮帮我吗?谢谢。

【问题讨论】:

  • 您确定 Name 是公共属性,而不是公共字段吗?
  • 谢谢克莱门斯,但它实际上是公共财产。摘录:公共接口配置{字符串名称{get;设置;}}

标签: c# wpf xaml mvvm


【解决方案1】:

由于错误中提到了__ComObject,我假设您要绑定的对象集合实际上是实现“配置”接口的 COM 对象,而不是 CLR 对象。

(无论 COM 对象实际上是使用 C#(使用 ComVisible(true))还是 C++ 实现的,都无关紧要,这是您使用“接口”的事实 - 我假设它来自“COM 互操作库”,即之后您是否添加了对 COM 库的引用?)。

你可以试试这个:

<TextBlock Text="{Binding (mynamespacewithinterface:Configuration.Name)}" />

否则,您可以查看这些链接以了解 Binding 系统解决绑定的困难(COM 接口和 NET 接口各有自己的怪癖/限制),以及一些解决方法:

【讨论】:

    【解决方案2】:

    据我所知,ComObjects 在 .NET 中是 dynamic,因此编译器在编译时永远不会识别对象属性的名称。如果这对您来说真的很重要,那么只需创建一个实现 INotifyPropertyChanged 接口的 .NET 包装对象,并将该对象的所有属性复制到您的 WPF 对象。然后编译器显然能够读取属性的名称。

    【讨论】:

    • 创建一个包装器帮助了我。谢谢!
    猜你喜欢
    • 2013-12-13
    • 2011-09-11
    • 2012-07-20
    • 2017-01-07
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多